《head First设计模式》阅读笔记01_策略模式
时间:2020-06-30
本文章向大家介绍
《head First设计模式》阅读笔记01_策略模式
,主要包括
《head First设计模式》阅读笔记01_策略模式
使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.模拟鸭子系统引出策略模式
1.1.系统设计构思
1.2.系统代码实现
1.2.1.定义鸭子行为接口及实现
1.2.1.1.飞行行为接口及实现
package com.wf.strategy.behavior; /** * @ClassName FlyBehavior * @Description 鸭子飞行行为 * @Author wf * @Date 2020/6/30 10:06 * @Version 1.0 */ public interface FlyBehavior { void fly(); } package com.wf.strategy.behavior; /** * @ClassName FlyWithWings * @Description 带翅膀会飞的鸭子行为 * @Author wf * @Date 2020/6/30 10:08 * @Version 1.0 */ public class FlyWithWings implements FlyBehavior { public void fly() { System.out.println("我会飞,I'm flying..."); } } package com.wf.strategy.behavior; /** * @ClassName FlyNoWay * @Description 不会飞的鸭子行为 * @Author wf * @Date 2020/6/30 10:08 * @Version 1.0 */ public class FlyNoWay implements FlyBehavior { public void fly() { //什么也不做,不会飞
System.out.println("I can't fly...");
}
}
1.2.1.2.鸭子叫声行为接口及实现
package com.wf.strategy.behavior; /** * @ClassName QuackBehavior * @Description 鸭子呱呱叫行为 * @Author wf * @Date 2020/6/30 10:06 * @Version 1.0 */ public interface QuackBehavior { void quack(); } package com.wf.strategy.behavior; /** * @ClassName Squeak * @Description 吱吱叫的鸭子行为 * @Author wf * @Date 2020/6/30 10:14 * @Version 1.0 */ public class Squeak implements QuackBehavior { public void quack() { System.out.println("鸭子吱吱叫,Squeak"); } } package com.wf.strategy.behavior; /** * @ClassName Quack * @Description 呱呱叫的鸭子行为 * @Author wf * @Date 2020/6/30 10:14 * @Version 1.0 */ public class Quack implements QuackBehavior { public void quack() { System.out.println("鸭子呱呱叫,Quack"); } } package com.wf.strategy.behavior; /** * @ClassName Quack * @Description 不会叫,安静的鸭子行为 * @Author wf * @Date 2020/6/30 10:14 * @Version 1.0 */ public class MuteQuack implements QuackBehavior { public void quack() { System.out.println("<Silence>"); } }
1.2.2.鸭子超类定义
package com.wf.strategy.imitateduckgame.duck; import com.wf.strategy.behavior.FlyBehavior; import com.wf.strategy.behavior.QuackBehavior; /** * @ClassName Duck * @Description 鸭子超类抽象 * @Author wf * @Date 2020/6/30 10:26 * @Version 1.0 */ public abstract class Duck { protected FlyBehavior flyBehavior; protected QuackBehavior quackBehavior; public void swim(){ System.out.println("All ducks float,even decoys"); } //不同的鸭子,有不同的外形 public abstract void display(); //委托接口实现具体行为 public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } }
1.2.2.1.实现不同类型的鸭子
实现一个绿头鸭,会飞,能呱呱叫。
package com.wf.strategy.imitateduckgame.duck; import com.wf.strategy.behavior.FlyWithWings; import com.wf.strategy.behavior.Quack; /** * @ClassName MallardDuck * @Description 绿头鸭 * @Author wf * @Date 2020/6/30 10:41 * @Version 1.0 */ public class MallardDuck extends Duck { public MallardDuck(){ //暂时在构造器中,初始化鸭子行为:会飞,能呱呱叫 flyBehavior = new FlyWithWings(); quackBehavior = new Quack(); } public void display() { System.out.println("I'm a real Mallard duck"); } }
1.2.3.测试类
package com.wf.strategy.imitateduckgame.duck; public class MiniDuckSimulator { public static void main(String[] args) { //定义一种鸭子实例 Duck mallard = new MallardDuck(); //测试鸭子行为 mallard.performFly(); mallard.performQuack(); } }
测试结果如下:
1.2.4.优化系统
1.2.4.1.动态设置鸭子行为
前面的设计中,通过在鸭子子类实现的构造器中初始化,鸭子行为。代码不够弹性,健壮。
现在,在鸭子超类中,提供setter方法,然后由客户端调用时,动态设置鸭子行为。
1.修改Duck类
增加setter方法,代码修改如下:
package com.wf.strategy.imitateduckgame.duck; import com.wf.strategy.behavior.FlyBehavior; import com.wf.strategy.behavior.QuackBehavior; /** * @ClassName Duck * @Description 鸭子超类抽象 * @Author wf * @Date 2020/6/30 10:26 * @Version 1.0 */ public abstract class Duck { protected FlyBehavior flyBehavior; protected QuackBehavior quackBehavior; public void swim(){ System.out.println("All ducks float,even decoys"); } //不同的鸭子,有不同的外形 public abstract void display(); //委托接口实现具体行为 public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } public void setFlyBehavior(FlyBehavior flyBehavior) { this.flyBehavior = flyBehavior; } public void setQuackBehavior(QuackBehavior quackBehavior) { this.quackBehavior = quackBehavior; } }
1.2.4.2.扩展系统---增加一种模型鸭
1.新增鸭子类型:模型鸭
package com.wf.strategy.imitateduckgame.duck; import com.wf.strategy.behavior.FlyNoWay; import com.wf.strategy.behavior.Quack; /** * @ClassName ModelDuck * @Description 模型鸭 * @Author wf * @Date 2020/6/30 11:14 * @Version 1.0 */ public class ModelDuck extends Duck { public ModelDuck() { //初始化时,模型鸭不会飞行 flyBehavior = new FlyNoWay(); quackBehavior = new Quack(); } public void display() { System.out.println("I'm a model duck"); } }
2.新建一种飞行行为
利用火箭助力,帮助模型鸭飞行。代码如下:
package com.wf.strategy.behavior; /** * @ClassName FlyRocketPowered * @Description 火箭助力飞行 * @Author wf * @Date 2020/6/30 11:17 * @Version 1.0 */ public class FlyRocketPowered implements FlyBehavior { public void fly() { System.out.println("I'm flying with a rocket!!"); } }
1.2.4.3.修改测试类
增加对模型鸭,行为测试:
package com.wf.strategy.imitateduckgame.duck; import com.wf.strategy.behavior.FlyRocketPowered; public class MiniDuckSimulator { public static void main(String[] args) { //定义一种鸭子实例 Duck mallard = new MallardDuck(); //测试鸭子行为 mallard.performFly(); mallard.performQuack(); //测试新增加模型鸭,行为 Duck model = new ModelDuck(); model.performFly(); //一开始不会飞行 //动态设置飞行行为,使用火箭助力飞行 model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } }
测试结果如下:
总结:
通过对模型鸭的行为测试:一开始,模型鸭是不会飞行的。而调用setter方法,进行设置飞行行为,
以达到动态设置飞行行为的目的。
1.3.策略模式定义
上面的系统设计,使用了策略模式。现在,给策略模式,下一个标准的定义:
策略模式 :
定义算法簇,分别封装起来,让它们之间互相替换。此模式让算法的变化独立于使用算法的客户。
1.3.1.系统类图
原文地址:https://www.cnblogs.com/wfdespace/p/13213514.html
- 由for V.S. for each想到的
- 日调度5万亿次,腾讯云微服务架构体系TSF深度解读
- sed的粉丝
- 在Managed Code通过Google Gmail发送邮件以及如何通过Outlook配置Gmail
- 平方根的C语言实现(一) —— 浮点数的存储
- 用awk写递归
- bc计算A股上市新股依次涨停股价
- ASP.NET Core应用的错误处理[1]:三种呈现错误页面的方式
- python访问http的GET/POST
- 用openssl库RSA加密解密
- Kobject浅析
- ASP.NET Core应用的错误处理[2]:DeveloperExceptionPageMiddleware中间件如何呈现“开发者异常页面”
- RSA简介(二)——模幂算法
- 为虚拟机vCPU绑定物理CPU
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Day19:顺时针打印矩阵
- 疑似 KimsukyAPT 组织最新攻击活动样本分析
- 查找被删除但仍然占据磁盘的文件
- WPF 获取本机所有字体拿到每个字符的宽度和高度
- WPF 自己封装 Skia 差量绘制控件
- C# dotnet 使用 OpenXml 解析 Word 文件
- Day20:包含min函数的栈
- No module named ‘SerialClient‘和Cannot import package : rosserial_arduino
- 提升开发效率N倍的20+命令行神器!(附 demo)
- Java反射原理
- 【每日一题】46. Permutations
- 免费下论文的10个方法
- 【原创】90%的人都不会做的一道笔试题
- 这10道 Spring 常见面试题,你能搞定吗?
- 网工小白升级打怪篇(二)telnet实现远程管理