【学习笔记】设计模式-策略模式
来源:互联网 发布:网络创业培训试题 编辑:程序博客网 时间:2024/06/04 23:18
前言
本文来自《Head Fist 设计模式》一书的实例,这里仅仅是个人笔记记录
策略模式的定义
定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户
Demo 需求
鸭子游戏文化公司旗下有3款鸭子
绿鸭子:会游泳,会飞,会叫
哑巴鸭子:会游泳,会飞,不会叫
塑料鸭子:会游泳,不会飞,不会叫
其中后期塑料鸭子会加入声音功能,需要预留接口后续拓展
需求分析
3款鸭子都会游泳,可以使用Duck基类,子类继承即可
会飞,会叫的行为是根据鸭子的形态动态的变化,这里我们可以使用setBehavior()来进行动态设置
开发
定义Duck超类及其子类
Duck 基类
package strategy_pattern;/** * 基类 * 1.游泳 * 2.叫 * 3.飞 * * 其中所有的鸭子都会游泳 * 全能鸭子:会游泳,会叫,会飞 * 塑料鸭子:会游泳,不会叫,不会飞 * 哑巴鸭子:会游泳,不会叫,会飞 * * 上述的需求 * 会游泳,可以根据继承的关系实现这个基类 * 会叫和会飞的行为要区分个性化处理 */public class Duck { private FlyBehavior mFlyBehavior; private SqueakBehavior mSqueakBehavior; public void setFlyBehavior(FlyBehavior mFlyBehavior) { this.mFlyBehavior = mFlyBehavior; } public void setSqueakBehavior(SqueakBehavior mSqueakBehavior) { this.mSqueakBehavior = mSqueakBehavior; } public void swim() { System.out.print("I can swim"); } public void performerFly() { mFlyBehavior.fly(); } public void performSqueak() { mSqueakBehavior.performSqueak(); }}
Duck 子类
package strategy_pattern;/** * 全能的鸭子,会游泳,会飞,会叫 */public class GreenDuck extends Duck { public GreenDuck() { mFlyBehavior = new YesFlyBehavior(); mSqueakBehavior = new YesSqueakBehavior(); }}package strategy_pattern;/** * 哑巴鸭子,会游泳,会飞,但是不会叫 */public class MuteDuck extends Duck{ public void MuteDuck() { mFlyBehavior = new YesFlyBehavior(); mSqueakBehavior = new NoSqueakBehavior(); }}package strategy_pattern;/** * 塑料鸭子,只会游泳,不会飞,不会叫 */public class PlasticsDuck extends Duck { public void PlasticsDuck() { mFlyBehavior = new NoSqueakBehavior(); mSqueakBehavior = new NoSqueakBehavior(); }}
定义行为接口
基类接口
package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public interface SqueakBehavior { void performSqueak();}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public interface FlyBehavior { void fly();}
接口子类
package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class YesFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.print("I can fly"); }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class NoFlyBehavior implements FlyBehavior{ @Override public void fly() { System.out.print("I can not fly"); }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class YesSqueakBehavior implements SqueakBehavior{ @Override public void performSqueak() { System.out.print("I can Squeak"); }}package strategy_pattern;/** * Created by Fadi.Su on 2017/11/25. */public class NoSqueakBehavior implements SqueakBehavior{ @Override public void performSqueak() { System.out.print("I can not Squeak"); }}
Duck类和行为类联通调试
/** * 定义了算法族,分别封装起来,让他们之间可以相互转换,此模式让算法的变化独立于使用算法的客户 */ public void testDuck() { // 绿鸭子:会游泳,会飞,会叫 Duck mGreenDuck = new GreenDuck(); mGreenDuck.swim();// 继承实现 mGreenDuck.performerFly(); // 策略模式 mGreenDuck.performSqueak();// 策略模式 // 哑巴鸭子:会游泳,会飞,不会叫 Duck mMuteDuck = new MuteDuck(); mMuteDuck.swim();// 继承实现 mMuteDuck.performerFly();// 策略模式 mMuteDuck.performSqueak();// 策略模式 // 塑料鸭子:会游泳,不会飞,不会叫 Duck mPlasticsDuck = new PlasticsDuck(); mPlasticsDuck.swim();// 继承实现 mPlasticsDuck.performerFly();// 策略模式 mPlasticsDuck.performSqueak();// 策略模式 /** * * 策略模式的特点,可以动态改变类的行为 * 这样使得塑料鸭子赋予了叫的功能 */ mPlasticsDuck.setSqueakBehavior(new YesFlyBehavior()); mPlasticsDuck.performerFly(); }
结语
/** * * 策略模式的特点,可以动态改变类的行为 * 这样使得塑料鸭子赋予了叫的功能 */ mPlasticsDuck.setSqueakBehavior(new YesFlyBehavior()); mPlasticsDuck.performerFly();
其实我们写代码中经常无意地使用了策略模式。
阅读全文
0 0
- 策略设计模式--学习笔记
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记:策略模式
- 设计模式学习笔记--策略(Strategy)模式
- 设计模式学习笔记七:策略模式
- 设计模式学习笔记--策略模式
- 设计模式学习笔记-策略模式
- 设计模式学习笔记—策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记(一):策略模式
- 大话设计模式学习笔记---策略模式
- 设计模式学习笔记之策略模式
- 设计模式学习笔记--策略模式
- [学习笔记]设计模式[0]-{策略模式}
- 设计模式学习笔记之策略模式
- 设计模式学习笔记-策略模式
- mysql事务还原点操作
- 概率论基础之一:事件的概率
- bower 笔记
- mysql 外连接
- HDU
- 【学习笔记】设计模式-策略模式
- 【算法学习笔记】二叉树遍历
- python count()计算字符出现的频数
- 杭电ACM OJ 1026 Ignatius and the Princess I DFS+BFS
- 线程安全与锁优化(JVM)
- 小谈微习惯
- PHP 函数 数组引用传参数
- Binlog日志的三种模式介绍及模式修改
- 结合redis设计与实现的redis源码学习-12-RDB持久化(rdb.h/rio.h)