美文网首页
策略模式

策略模式

作者: setone | 来源:发表于2018-07-30 17:03 被阅读0次

    设计原则:

    1.找出应用中可能需要的变化之处,把他们独立出来,不要和那些不需要变化的代码混在一起
    2.针对接口编程,而不是针对实现编程
    3.多用组合,少用继承
    

    策略模式:

    定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户
    

    如图是一个简化版的策略模式,
    场景:
    MallardGame在这里面是一个战士,MallardGame在格斗中想要用宝剑进行格斗,也想用弓箭进行射击,同时MallardGame也有可能用拳头进行攻击
    ps:会有第二个MallardGame,第三个MallardGame......


    image.png

    先把工具包代码放出来

    public class Console {
    
        public static void log(Object obj) {
            System.out.println( obj);
        }   
    
    }
    

    接口 WeaponBehavior.java,impl包里面的所有类都会实现这个借口

    public interface WeaponBehavior {
        /**
         *  @功能:动作
         *  @作者:jh @代号:金花
         *  @时间:2018年7月30日  
         */
        void useWeapon();
    }
    

    具体实现类 SwordBehavior.java,这里只会写一个实现类,三个实现类只是打印的文字不同而已

    public class SwordBehavior implements WeaponBehavior{
    
        @Override
        public void useWeapon() {
            Console.log("实现用宝剑挥舞");
        }
    
    }
    

    然后后就是核心的抽象类Character.java

    public abstract class Character {
        public WeaponBehavior weaponBehavior;
    
        /**
         *  @功能:调用操作
         *  @作者:jh @代号:金花
         *  @时间:2018年7月30日  
         */
        public void fight() {
            weaponBehavior.useWeapon();
        }
    
        public void setWeaponBehavior(WeaponBehavior weaponBehavior) {
            this.weaponBehavior = weaponBehavior;
        }
    
    }
    

    最外层的初始化类 MallardGame.java

    public class MallardGame extends Character {
        /**
         *  @功能:初始化接口
         *  @作者:jh @代号:金花
         *  @时间:2018年7月30日  
         */
        public MallardGame() {
            weaponBehavior = new SwordBehavior();
        }
        
    }
    
    

    main方法

    public class ThisTest {
        public static void main(String[] args) {
            MallardGame mg = new MallardGame();
            mg.fight();
            mg.setWeaponBehavior(new BowAndArrowBehavior());
            mg.fight();
        }
    }
    
    

    main执行结果


    image.png

    可以看见在set方法执行后我们动态的改变了执行结果,WeaponBehavior接口在被我们动态的改变,程序变得更加灵活,相对独立,实现类互相替换

    相关文章

      网友评论

          本文标题:策略模式

          本文链接:https://www.haomeiwen.com/subject/gmbfvftx.html