设计模式之策略
来源:互联网 发布:handlebars.js 编辑:程序博客网 时间:2024/06/10 00:39
例题:模拟鸭子
各种颜色,各种不同动作,如飞,叫,游泳
1)分析项目变化与不变部分,提取变化部分,抽象成接口+实现;
2)鸭子哪些功能是会根据新需求变化的?叫声、飞行…
类图:
关键代码:
1. 将动作抽象成接口package simulateDuck.behavior.fly;public interface FlyBehavior{ void fly();}2. 定义具体动作package simulateDuck.behavior.fly;public class GoodFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println("--Good Fly--"); }}package simulateDuck.behavior.fly;public class NoFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.println("--No Fly--"); }}3. 抽象实体package simulateDuck.Duck;import simulateDuck.behavior.fly.FlyBehavior;import simulateDuck.behavior.quack.QuackBehavior;public abstract class Duck{ FlyBehavior m_flyBehavior; QuackBehavior m_QuackBehavior; public Duck() { } public void Fly() { m_flyBehavior.fly(); } public void Quack() { m_QuackBehavior.quack(); } public abstract void display(); public void setM_flyBehavior(FlyBehavior m_flyBehavior) { this.m_flyBehavior = m_flyBehavior; } public void setM_QuackBehavior(QuackBehavior m_QuackBehavior) { this.m_QuackBehavior = m_QuackBehavior; } public void swim() { System.out.println("~~im swim~~"); }}4. 具体实体package simulateDuck.Duck;import simulateDuck.behavior.fly.GoodFlyBehavior;import simulateDuck.behavior.quack.GaGaQuackBehavior;public class GreenHeadDuck extends Duck{ public GreenHeadDuck() { m_flyBehavior=new GoodFlyBehavior(); m_QuackBehavior=new GaGaQuackBehavior(); } @Override public void display() { System.out.println("**Green Head**"); }}5. 入口package Main;import simulateDuck.Duck.Duck;import simulateDuck.Duck.GreenHeadDuck;import simulateDuck.Duck.RedHeadDuck;import simulateDuck.behavior.fly.NoFlyBehavior;import simulateDuck.behavior.quack.NoQuackBehavior;public class SimulateDuck{ public static void main(String[] args) { Duck greenHeadDuck=new GreenHeadDuck(); Duck redHeadDuck=new RedHeadDuck(); greenHeadDuck.display(); greenHeadDuck.Fly(); greenHeadDuck.Quack(); greenHeadDuck.swim(); System.out.println("****************************"); redHeadDuck.display(); redHeadDuck.Fly(); redHeadDuck.Quack(); redHeadDuck.swim(); System.out.println("******************************"); redHeadDuck.display(); redHeadDuck.setM_flyBehavior(new NoFlyBehavior()); redHeadDuck.Fly(); redHeadDuck.setM_QuackBehavior(new NoQuackBehavior()); redHeadDuck.Quack(); }}
策略模式:分别封装行为接口,实现算法族,超类里放行为接口对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
总结一波:
1、分析项目中变化部分与不变部分
2、多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性
3、设计模式有没有相应的库直接使用?有些库或框架本身就用某种设计模式设计的
4、如果找不到适用的模式怎么办
源码地址:
http://download.csdn.net/detail/kaikai_sk/9872006
阅读全文
0 0
- 设计模式之策略
- 设计模式之策略
- 设计模式之策略
- 设计模式之策略
- 设计模式之策略
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- 设计模式之策略模式
- Apache Zeppelin 中 JDBC通用 解释器
- jquery dialog api
- Jquery——将Jquery序列化后的表单值转换成Json
- 列表侧滑删除和点击下滑
- 过滤后端返回的数组每条连续重复一遍问题
- 设计模式之策略
- vue.js安装过程(npm安装)
- tomcat无法识别单双引号的问题
- 遇到问题----MongoDB---JAVA--大批量操作先删后存时偶尔出现保存的文档也被删除
- ubuntu终端su认证失败:允许su到root的方法
- 如何通过Java代码将JsonArray转化为list集合
- ElasticSearch并发操作之乐观锁的使用
- 安卓JNI分析
- androidsutdio那些坑