策略模式是对算法的包装,是把使用算法的责任和算法本身分割开来,委派给不同的对象管理,我个人的理解是,具有相同行为不同的行为模式,比如走路,有人速度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!"); } }
思考时间:策略模式是怎么个思路,有什么好处?
策略模式是把某一行为具体的算法封装到一系列类中,具有这一行为的对象类具有这些算法类,行为类调用行为函数时,只需要调用内部拥有的算法类的方法即可。
好处是如果需要修改或者增加,只要增加或者修改对应的算法类就可以,不必修改行为类,耦合度大大降低。