设计模式之策略模式
2016-06-09 00:00
169 查看
策略模式:定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.此模式主要使用的设计原则是依赖倒置原则.
使用鸭子来举个列子,鸭子分为家鸭,野鸭,木头鸭。家鸭能叫不能飞,野鸭能叫又能飞,木头鸭不能叫也不能飞。 那么我们就可以把飞和叫定义为两个不同的算法族。
飞行算法族:
叫算法族:
这两个算法族都使用了依赖倒置的原则,这个原则的好处是:易于扩展。比如:某天突然需要增加一个安装了火箭喷射器的唐老鸭,我们就只需要在实现这两个算法接口,而不用破坏程序结构。
算法族的使用者鸭子:
执行一下:
源码下载
使用鸭子来举个列子,鸭子分为家鸭,野鸭,木头鸭。家鸭能叫不能飞,野鸭能叫又能飞,木头鸭不能叫也不能飞。 那么我们就可以把飞和叫定义为两个不同的算法族。
飞行算法族:
[code=language-java]/** *飞行算法族 * @author zhuleqi */ public interface FlyBehavior { public void fly(); }
[code=language-java]/** *使用翅膀飞行 * @author zhuleqi */ public class FlyWithWings implements FlyBehavior{ @Override public void fly() { System.err.println("fly with wing"); } }
[code=language-java]/** *不能飞行 * @author zhuleqi */ public class NoFly implements FlyBehavior{ @Override public void fly() { System.err.println("I can't fly"); } }
叫算法族:
[code=language-java]/** *叫算法族 * @author zhuleqi */ public interface QuackBehavior { public void quack(); }
[code=language-java] /** * * @author zhuleqi */ public class NormalQuack implements QuackBehavior{ @Override public void quack() { System.err.println("我是一只正常叫的鸭子"); } }
[code=language-java]/** * * @author zhuleqi */ public class NoQuack implements QuackBehavior { @Override public void quack() { System.err.println("I can not quack"); } }
这两个算法族都使用了依赖倒置的原则,这个原则的好处是:易于扩展。比如:某天突然需要增加一个安装了火箭喷射器的唐老鸭,我们就只需要在实现这两个算法接口,而不用破坏程序结构。
算法族的使用者鸭子:
[code=language-java] /** * 算法族的客户 * @author zhuleqi */ public class Duck { /** * 鸭子的飞行行为 */ private FlyBehavior flyBehavior; /** * 鸭子的叫 */ private QuackBehavior quackBehavior; public void display() { System.err.println(" 我是鸭子"); } public void swim() { System.err.println(" 我可以在水里游"); } public void fly() { if(this.getFlyBehavior() == null){ return; } this.getFlyBehavior().fly(); } public void quack() { if(this.getQuackBehavior() == null){ return ; } this.getQuackBehavior().quack(); } /** * @return the flyBehavior */ public FlyBehavior getFlyBehavior() { return flyBehavior; } /** * @param flyBehavior the flyBehavior to set */ public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } /** * @return the quackBehavior */ public QuackBehavior getQuackBehavior() { return quackBehavior; } /** * @param quackBehavior the quackBehavior to set */ public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
执行一下:
[code=language-java]/** * 策略模式定义了算法族,分别封装起来,让它们之间相互替换,此模式让算法的变化独立于算法的客户.主要使用的设计原则是依赖倒置原则. * * @author zhuleqi */ public class Strategy { public static void main(String[] args) { Duck duck = new Duck(); duck.setFlyBehavior(new FlyWithWings()); duck.setQuackBehavior(new NormalQuack()); print(duck); } private static void print(Duck duck) { duck.display(); duck.fly(); duck.quack(); } }
源码下载
相关文章推荐
- SQL SERVER存储过程中如何使用事务与try catch
- 二进制单位
- 机器学习十大算法
- unix编程之多线程编程
- javaweb框架比较
- 通过Openlayers实现实时定位
- HDU 1595 find the longest of the shortest (Dijkstra算法)
- 关于mysql的安装、配置及更改密码需注意的问题
- ITQ(Iterative Quantization)迭代量化方法详解 hash 哈希算法
- 进程与线程关系
- 在QtCreator中使用doxygen
- C语言/指针
- 老照片
- 小白看 KMP算法
- ACM:蓝桥杯:韩信点兵
- Netbeans8.1 IDE的插件和历史记录(二)
- Spring Boot 实践折腾记(二):切入点,Spring MVC集成Mybatis的经典例子
- hdu2795Billboard
- java项目文件的路径问题
- 通过Activity设置动态Fragment中的ListView(通过SimpleCursorAdapter适配)