设计模式(二) 策略模式Strategy

  策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度3m/s,有人100m/s,把他们的具体行走和对象本身走路的行为分开,这样即使行走的算法变了,只要改改算法类,对象类就不用改了。

  我们还是玩红警,现在已经造好了我们的战车工厂PanzerFactory,有两个坦克灰熊坦克BearPanzer和光棱坦克EdgelightPanzer在工厂里等待临幸。

  这两个坦克都是可以移动的,现在假设我们的坦克可以攻击和防守(我记得好像兵才有这个功能,算啦,懒得再写类了),先在我们给他们点上攻击和防守的技能点。

  把攻击抽象出一个接口

public interface PanzerStrategy {
    public void doAction();
}

  让我们的坦克具有这两种行为

public class Panzer {
    protected String name;
    //加入一个策略类对象
    protected PanzerStrategy panzerStrategy;
        
    public void move(){
        System.out.println(name+"移动了!");
    }    
    //具体行为方法
    protected void doAction(){
        System.out.print(name);
        panzerStrategy.doAction();
    }
}

public class BearPanzer extends Panzer{
    
    public BearPanzer(PanzerStrategy panzerStrategy){
        this.panzerStrategy=panzerStrategy;
        name="灰熊坦克";
        System.out.println(name+"制造完成");
    }
    
}

public class EdgelightPanzer extends Panzer {
    public EdgelightPanzer(PanzerStrategy panzerStrategy){
        this.panzerStrategy=panzerStrategy;
        name="光棱坦克";
        System.out.println(name+"制造完成");
    }
}

  还有战车工厂,目前的游戏模式,一个坦克出来的时候他有个默认的使命,攻击或者防守

public class PanzerFactory {
    
    public PanzerFactory() {
        System.out.println("战车工厂造好了");
    }
    
    public Panzer createPanzer(String panzerName,PanzerStrategy panzerStrategy){
        Panzer panzer=null;
        switch (panzerName) {
        case "灰熊坦克":
            panzer=new BearPanzer(panzerStrategy);
            break;
        case "光棱坦克":
            panzer=new EdgelightPanzer(panzerStrategy);
            break;
        default:
            break;
        }
        return panzer;
    }
}

  现在又可以开一盘啦,这次我们造10个坦克,让灰熊守家,光棱去纵横驰骋

  

public class RedAlert {
    public static void main(String[] args) {
        System.out.println("开局......");

        PanzerFactory factory=new PanzerFactory();
        System.out.println("开始造坦克");
        Panzer[] panzer=new Panzer[10];
        //这个就是我们的两种指令
        PanzerStrategy attackStratege=new AttackStratege();
        PanzerStrategy defenseStratege=new DefenseStratege();
        for (int i = 0; i <5; i++) {
            panzer[i]=factory.createPanzer("灰熊坦克",defenseStratege);
        }
        for (int i = 5; i <10; i++) {
            panzer[i]=factory.createPanzer("光棱坦克",attackStratege);
        }
        for (Panzer p : panzer) {
            p.doAction();
        }
        System.out.println("YOU WIN!");
    }
}

  

  思考时间:策略模式是怎么个思路,有什么好处?

  策略模式是把某一行为具体的算法封装到一系列类中,具有这一行为的对象类具有这些算法类,行为类调用行为函数时,只需要调用内部拥有的算法类的方法即可。

  好处是如果需要修改或者增加,只要增加或者修改对应的算法类就可以,不必修改行为类,耦合度大大降低。

  

  

原文地址:https://www.cnblogs.com/alexfly/p/7297732.html