美文网首页
策略模式

策略模式

作者: 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