设计模式之策略模式

先大致介绍下设计模式,总共有 23 种设计模式。

这些模式可以分为三大类:创建型模式(Creational Patterns)、结构型模式(Structural Patterns)、行为型模式(Behavioral Patterns)。当然,我们还会讨论另一类设计模式:J2EE 设计模式。

近日学习了几个常见的设计模式,比如策略模式

策略模式(Strategy):策略模式是一种定义一系列算法的方法,从概念上来看,所有这些算法完成的都是相同的工作,只是实现不同,它可以以相同的方式调用所有的算法,减少了各种算法类与使用算法类之间的耦合

优点:
1.策略模式的Strategy类层次为Context定义了一系列的可供重用的算法或行为.继承有助于析取出这些算法中的公共功能[DP]
2.简化了单元测试,因为每个算法都有自己的类,可以通过接口单独测试[DPE]
3.当不同的行为堆砌在一个类中时,就很难避免使用条件语句来选择和是的行为.将这些行为封装在一个个独立的Strategy类中,可以在使用这些行为的类中消除条件语句[DP]

策略模式结构图:

 学习的时候发现这些概念太过抽象而且不易于记忆,就写了两个实例,实例如下:

实例一:

场景:赵云跟随刘备去东吴求亲,诸葛亮交与他三个锦囊,最后让孙权赔了夫人又折兵

首先创建了一个公共接口,创建operate方法

public interface IStrategy {
    void operate();
}

然后创建三个子类(也就是三个锦囊)去实现公共接口:

三个子类都实现了公共接口也继承了operate方法

public class FirstMethod implements IStrategy {
    @Override
    public void operate() {
        System.out.println("找乔国老帮忙,让吴国太给孙权");
    }
}



public class SecondMethod implements IStrategy {
    @Override
    public void operate() {
        System.out.println("求吴国太开个绿灯");
    }
}



public class ThirdMethod implements IStrategy {
    @Override
    public void operate() {
        System.out.println("孙夫人断后");
    }
}

然后创建一个Context类,锦囊妙计要放在锦囊里面

public class Context {
    IStrategy iStrategy;
    //构造函数,要你使用哪个策略
    public Context(IStrategy strategy){
        this.iStrategy = strategy;
    }

    public void operate(){
        this.iStrategy.operate();
    }
}

最后就是客户端赵云携带锦囊遇到不同场合打开不同锦囊:

public class ZhaoYun {

    public static void main(String[] args){
        Context context;
        System.out.println("----------刚到吴国拆开第一个------------");
        context = new Context(new FirstMethod());
        context.operate();//拆开执行
        System.out.println("************************************");

        System.out.println("----------刚到吴国拆开第二个------------");
        context = new Context(new SecondMethod());
        context.operate();
        System.out.println("************************************");

        System.out.println("----------刚到吴国拆开第三个------------");
        context = new Context(new ThirdMethod());
        context.operate();
        System.out.println("************************************");
    }

}

运行结果:

 实例二:

场景:有以下角色:国王(King)、皇后(Queen)、骑士(Knight)、妖怪(Troll),这些角色可以在游戏中每一次使用一个武器(Weapon)来攻击对方,并且可以在运行时切换武器

先创建一个使用武器的公告接口

public interface WeaponBehavior {
     void useWeaPon();
}

然后创建各个武器的类来实现公共接口

public class KnifeBehavior implements WeaponBehavior {
    @Override
    public void useWeaPon() {
        System.out.println("我使用宝剑");
    }
}



public class AxeBehavior implements WeaponBehavior {
    @Override
    public void useWeaPon() {
        System.out.println("我使用斧头");
    }
}



public class BowAndArrowBehavior implements WeaponBehavior {
    @Override
    public void useWeaPon() {
        System.out.println("我使用弓箭");
    }
}



public class SwordBehavior implements WeaponBehavior {
    @Override
    public void useWeaPon() {
        System.out.println("我使用匕首");
    }
}

接着创建一个角色的抽象类和一个抽象方法display

public abstract class Role {
    WeaponBehavior weaponBehavior;
    //构造器
    public Role(){
    }
    public void setWeaponBehavior(WeaponBehavior weaponBehavior){
        this.weaponBehavior = weaponBehavior;
    }
    abstract void display();
    public void weaponWay(){
        weaponBehavior.useWeaPon();
    }
}

接下来就是创建各个角色的子类继承角色类并实现抽象方法

public class King extends Role {

    public King(){
        weaponBehavior = new AxeBehavior();
    }
    @Override
    void display() {
        System.out.println("我是国王");
    }
}



public class Queen extends Role {

    public Queen(){
        weaponBehavior = new KnifeBehavior();
    }
    @Override
    void display() {
        System.out.println("我是皇后");
    }
}


public class Knight extends Role{
    public Knight(){
        weaponBehavior = new SwordBehavior();
    }

    @Override
    void display() {
        System.out.println("我是骑士");
    }
}




public class Troll extends Role {
    public Troll(){
        weaponBehavior = new SwordBehavior();
    }
    @Override
    void display() {
        System.out.println("我是妖怪");
    }
}

最后创建一个测试类

public class Test {
    public static void main(String[] args){
        King king = new King();
        king.display();
        king.weaponWay();
        System.out.println("更换武器");
        king.setWeaponBehavior(new SwordBehavior());
        king.weaponWay();
        System.out.println("--------------------");

        Queen queen = new Queen();
        queen.display();
        queen.weaponWay();
        System.out.println("更换武器");
        queen.setWeaponBehavior(new AxeBehavior());
        queen.weaponWay();
        System.out.println("--------------------");

        Knight knight = new Knight();
        knight.display();
        knight.weaponWay();
        System.out.println("更换武器");
        knight.setWeaponBehavior(new BowAndArrowBehavior());
        knight.weaponWay();
        System.out.println("--------------------");

        Troll troll = new Troll();
        troll.display();
        troll.weaponWay();
        System.out.println("更换武器");
        troll.setWeaponBehavior(new KnifeBehavior());
        troll.weaponWay();
        System.out.println("--------------------");
    }
}

运行的结果是:

原文地址:https://www.cnblogs.com/Lukizzz/p/9685822.html