zoukankan      html  css  js  c++  java
  • 设计模式(二) 策略模式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!");
        }
    }

      

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

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

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

      

      

  • 相关阅读:
    Dockfile编写常见命令
    coreDNS域名无法解析问题
    开源软件
    容器相关
    日常工具
    持续集成
    mysql主从同步
    生产环境MySQL5.7-my.cnf 配置文件 for linux (转)
    工作交接流程引导图
    文章记录
  • 原文地址:https://www.cnblogs.com/alexfly/p/7297732.html
Copyright © 2011-2022 走看看