设计原则:
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接口在被我们动态的改变,程序变得更加灵活,相对独立,实现类互相替换
网友评论