《Head First 设计模式》读书笔记之1:设计模式入门(策略模式)

Head First Design Pattern《深入浅出设计模式》读书笔记 Chapter 01 Intro to Design Patterns 第01章 设计模式入门   1. Design Principle Identify the aspects of your application that vary and separate them from what stays the same.  (P9) 设计原则:找出应用中可能需要变化之处,把它们独立出 阅读详情

   用一个鸭子模拟游戏为例子,开始我们的设计模式学习之旅。

 

首先,我们需要设计各种鸭子的父类,包含有鸭子的共同特征和行为:

Duck

quack()

swim()

display()

....    //鸭子的其他行为特征

 

后来,PM(产品经理)需要鸭子具有飞行的行为,于是我们觉得很自然得让父类Duck加入了fly()方法, 子类通过继承父类,就都具有了飞行的行为。

 

问题来了....

PM发现, 游戏中的玩具橡皮鸭也飞了起来.....   这可真是雷人啊。

 

于是,可怜的我们就必须要重新设计。我们想到了在父类中fly()方法不做任何实现, 由子类去各自实现自己的fly行为, 比如橡皮鸭的fly()就什么都不做。

但是,如果仔细想想,以后不断新增鸭子的种类, 我们要不断去实现和覆盖fly方法, 这样真是太悲催了....

 

该怎么办?

 

我们受到启发,想到必须要把这些fly特殊行为从Duck类中分离出来,建立一组新类来实现具体的行为。 这一组新类由fly行为类型的接口来实现。

OK, 我们设计了飞行行为的接口:

<interface>

FlyBehavior

我们可以针对这个接口实现不同的飞行类, 比如:FlyWithWings(真实的翅膀飞行),  FlyNoWay(不会飞,比如橡皮鸭)

 

这样,我们的鸭子父类代码可以如下:

public abstract class Duck{
    FlyBehavior  flyBehavior;
   
    public Duck(){
   }
 
    public abstract void display();
   
    public void performFly(){
    
    flyBehavior.fly();

  }

}


FlyBehavior接口的实现代码:

public interface FlyBehavior{
  public void fly();
}

public class FlyWithWings implements FylBehavior{
   public void fly()
   {
      ........
   }
}

public class FlyNoWay implements FlyBehavior  //不会飞
{
    public void fly()
   {
      ......
   }

}


 

现在的设计已经有了很大进步了, 但是我们还需要做到能够动态绑定具体的行为接口。于是,我们在Duck父类中,加入了新方法

public void setFlyBehavior(FlyBehavior fb)
{
    flyBehavior = fb;
}


这样,我们可以动态的切换鸭子具体行为了,太好了 哈哈

 

上述实现过程中, 我们把多个类组合起来使用,灵活性更强,耦合性也相对弱了很多。

 

 

做完上述设计,我们已经学会了第一个设计模式:策略模式(Strategy Pattern)

 

策略模式的定义:  它定义了算法族,分别封装起来,让他们之间可以相互替换,此模式算法的变化独立于使用算法的客户。

 

 

在软件开发上有个不变的真理: change

 

设计原则:

1. 找出应用中可能需要变化之处, 把他们独立出来, 别和不需要变化的代码混在一起。

2. 针对接口编程, 而不是针对实现编程。

3.多用组合,少用继承。

深入理解设计模式:《Head First设计模式》读书笔记 -- 策略模式 策略模式是23种设计模式中的一种,它被广泛应用于软件开发中以提供算法族的封装,并允许客户端在运行时选择算法的种类。策略模式定义了算法的家族,并让它们相互之间可以替换,且算法的变化不会影响到使用算法的客户端。在策略模式中,上下文通常是一个拥有策略接口引用的类,它通过策略接口实现具体策略的切换。上下文类的主要职责包括:维护一个策略对象的引用。提供设置策略对象的方法。根据需要调用策略对象的方法。上下文类通常会包含一组操作方法,这些方法会委派给当前激活的策略对象来执行具体的行为。 阅读详情

相关推荐

R语言笔记十:独立性检验函数

1.独立性检验函数        独立性检验是根据频数信息判断两类因子彼此相关或相互独立的假设检验。所谓独立性就是指变量之间是独立的,没有关系。 独立性检验算法:卡方检验、Fisher检验、Cochran-Mantel-Haenszel检验 2.假设检验 假设检验(Hypothesis Testing)是数理统计学中根据一定假设条件由样本推断总体的一种方法。 原假设——没有发生 备择假设——发生了 具体做法:根据问题的需要对所研究的总体作

weixin_44384631的博客 4111

《head first 设计模式》学习心得(一)

head first 设计模式这本书还是蛮贵的,不过对于初学软件设计的人来说值得一看。 大概看到一半的样子,把所能想到的写下来作为总结: 前面这八章讲了这么几个设计模式: 1. 策略模式: 这种模式的主要精神就是面向接口的编程。打个比方,我需要做菜,那么我有的是食材,需要的是一盘菜,那么我就定义一个父类,包含把食材变成菜的方法的声明,如果该声明为(c++ 版纯虚函数)abstract,那么

你瑞哥从来都不会投降 1157

高速接口电平标准互连设计:LVPECL、PECL与LVDS的实战解析

本文深入解析了LVPECL、PECL与LVDS三种高速接口电平标准的互连设计实战。针对信号共模电压、阻抗匹配等核心差异,详细对比了直流耦合与交流耦合两种主流方案,并提供了电阻网络计算、布局布线要点及光模块等特殊场景下的选型建议,帮助工程师解决高速信号间的“翻译”难题,确保信号完整性。

weixin_29198045的博客 537

HeadFirst设计模式_读书笔记_010_状态模式

状态模式:允许对象在内部状态改变的时候改变它的行为。   例如: 我们在12306上买票,行为是卖票,状态有两个,有余票则出票成功,余票不足就出票失败。 public class Station { public State state; private int tickets = 0; public Station(int tickets) { this.t...

youran02100210的专栏 184

Rust 与 C/C++:Rust 比 C/C++ 更好还是只是“技能问题”?

对于许多嵌入式系统开发人员而言,的崛起似乎掀起了一股不小的浪潮,特别是在相较于传统的语言,Rust的“内存安全”优势让人眼前一亮。然而,是否可以将Rust作为C/C++的替代品?或者说,Rust是否真的比C/C++更好,抑或它只是一个“技能问题”呢?在嵌入式开发的领域,我观察到,尽管Rust在一些高性能、内存安全敏感的场景中受到了广泛推崇,但它在实际应用中的普及度,特别是在嵌入式领域,依然有限。今天,我会从多个角度探讨这个问题,并且分享一些对于Rust、C/C++以及嵌入式系统开发的个人见解。

qq_63315166的博客 1300

解决Windows 10安装语言包时遇到的0x800F0954错误

在安装Windows 10操作系统的语言包时,如果遇到错误代码0x800F0954的提示,这无疑会让许多用户感到困惑和无助。这个错误通常意味着在安装过程中遇到了一些阻碍,导致无法正常完成语言包的安装。本文将为大家详细解析这个错误代码0x800F0954,并提供一系列有效的解决方法,帮助大家顺利安装所需的语言包。

nntxthml的博客 3793

Head First设计模式读书笔记三 装饰模式(个人理解:包装模式)

本文示例代码材料源自Head First设计模式 以前整理自己整理的装饰模式的链接:https://blog.csdn.net/u011109881/article/details/58719049 思想 最大特点就是不修改原有代码的前提下,可以新增功能,使用情况可以参见我之前的总结,时隔一年,发现原文(http://www.runoob.com/design-pattern/desig...

积跬步 至千里 387

汇川EASY系列之以太网通讯(套接字socket做从站)

汇川EASY系列的以太网通讯中的Socket字通讯,不能使用配置的方式实现,只能通过指令完成,本文将详细说明

这是一个长期关注工控行业技术的博客,实现0-1的突破,期待您的关注和留言 2999

《head first设计模式》阅读记录——设计模式入门

第一次接触设计模式,这本书是以java为基础

abamon的专栏 879

华为OD机试真题 新系统2026-04-01 C语言 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 230

深度强化学习在足式机器人中的应用 (一):基础原理与仿真环境

我们将首先深入探讨其背后的核心挑战与技术栈,然后详细推导机器人学和强化学习的基本数学原理,特别是剖析在机器人控制领域表现卓越的PPO算法。下面的独立Python脚本展示了Isaac Gym的基本API用法,加载一个Go1机器人(假设URDF已准备好),并让它执行一个简单的预设动作(正弦波运动),以此来熟悉仿真流程。:代码的核心是直接操作GPU上的PyTorch张量,避免了CPU和GPU之间的数据拷贝,这是实现高性能的关键。:所有计算(如伪策略中的正弦波计算)都应该是向量化的,一次性为所有。

VectorShift的博客 228

读《大话设计模式》和《head first 设计模式》心得

1.面向对象的编程,并不是类越多越好,类的划分是为了封装,但分类的基础是抽象,具有相同属性和功能的对象的抽象集合才是类。2.如果你能够想到多于一个的动机去改变一个类,那么这个类就具有多于一个的职责。就一个类而言,应该仅有一个引起它变化的原因。3.开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序员...

weixin_30587927的博客 318

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

《Head First设计模式》读书笔记 —— 入门&策略模式

Head First设计模式》读书笔记。

May21_F的博客 1006

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

《Head First 设计模式》读书笔记之策略模式

正式开始坚持写一些技术博客,我只是一个刚刚踏入计算机行业的菜鸟,能够写的东西也没有多少技术含量,但不管怎样,我已在路上,希望和同样走在这条道路上的小伙伴们共勉。文中的一些观点或是对技术的理解仅仅是建立在我目前水平基础之上的,难免会有错误或是可能误导别人的地方,还请各位看客批评指正,大家共同讨论,一起进步。 最近看了《Head First 设计模式》这本书,就拿它的读书笔记来当作我技术博客的开篇

Tison个人博客 528

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Java】《Head First设计模式》读书笔记01: 《Head First设计模式》到底讲了什么?新手怎么学才不会从入门到放弃

Head First设计模式》绝对不是一本让你“读完就忘”的教科书,它是一本训练营手册。它逼迫你不断思考软件变化之源,并通过手把手的故事和代码,把设计原则烙进你的思维里。从策略模式起,你就开始学会“把变化的地方揪出来关进笼子里”。后续每一个模式,都是在不同场景下对这个核心思想的进一步演绎。好好跟着书中的节奏走,别跳步,你会发现:六个月后,当你回看自己过去写的“一锅粥”代码时,会不由自主地皱起眉头,并脑海中自动浮现出一个合适的模式来重构它。那个时刻,你就真正入门了。

1161

《Head First设计模式》读书笔记

目录 一、设计模式入门与策略模式 二、观察者模式 三、装饰者模式 四、工厂模式 五、单件模式 六、命令模式 七、适配器与外观模式 八、模板方法模式 九、迭代器与组合模式 十、状态模式 十一、代理模式 十二、复合模式 十三、与设计模式相处 十四、其他模式 一、设计模式入门与策略模式 1.使用模式最好的方式是:“把模式装进脑子里,然后在你的设计和已有的应用中,寻找何处可以使用它们。” 2.软件开发的一个不变真理:改变 3.第一个设计原则:分离需要变化的代码和不需要变化的代

weixin_52847003的博客 1012

【Java】《Head First设计模式》读书笔记02: 策略模式深度解析 - 从“鸭子困境”到掌握设计原则

继承虽然提供复用,但容易把行为静态绑定,导致代码在变化时脆弱不堪。单纯使用接口能抽离行为,但无法复用实现,造成大量重复代码。设计原则1:找出变化的部分并封装之。设计原则2:面向接口编程,而非面向实现。设计原则3:多用组合,少用继承。策略模式定义:定义一系列算法,封装每一个算法,并使它们可以相互替换。策略模式让算法的变化独立于使用它的客户。策略模式的结构:抽象策略接口 → 具体策略实现 → 上下文对象持有策略引用,通过委托执行行为。可以在运行时动态切换策略,提供极大的灵活度。

1280

【C++】《Head First设计模式》读书笔记01: 《Head First设计模式》用C++学,从“鸭子模拟器”到掌握设计精髓

Head First设计模式》用故事化的方式帮你建立了面向变化的设计思维。当你用C++实现这些模式时,你会发现:内存管理、虚函数开销、模板的静态多态这些语言特性,并不是障碍,而是实现设计原则的强大工具。从策略模式开始,你学会了把变化“关进笼子”。继续学下去,你再看自己过去写的代码,会自然地问:“这里什么可能会变?我该如何隔离它?” —— 那个时刻,你就真的把设计模式学活了。

944

《Head First设计模式》读书笔记_第一章

策略模式 例:设计一个模拟鸭子游戏,游戏中有各种鸭子,一边戏水一边嘎嘎叫。 所以学习设计模式前,我们最先想到的就是设置一个超类,并让其他子类去继承这个类,UML图如下: * * 但是,程序需求是会经常变动的,若给游戏中加入飞行方法以及玩具小黄鸭呢?并不是所有鸭子都可以飞,也并不是所有鸭子都是嘎嘎叫。 此时你可能会想,在父类添加相应方法,在子类重写就可以让不同鸭子的同一方法具有不同表...

少说,多做。 8213

【Python】《Head First设计模式》读书笔记02: 策略模式Python深度解析:用鸭子类型优雅应对变化

继承虽然提供复用,但容易将行为静态绑定,需求变化时导致代码脆弱。单纯使用接口能抽离行为,但无法复用实现,产生大量重复代码。设计原则1:找出变化的部分并封装之。设计原则2:面向接口编程,而非面向实现。设计原则3:多用组合,少用继承。策略模式定义:定义一系列算法,封装每一个算法,并使它们可以相互替换。策略模式让算法的变化独立于使用它的客户。结构:抽象策略接口 → 具体策略实现 → 上下文持有策略引用,通过委托执行行为。Python中可用abc抽象基类实现,或更轻量地直接使用函数。

976

《head first设计模式》读书笔记(一)

文章目录前言第一章 设计模式入门模拟鸭子游戏创建变化-增加飞行功能运用模式设计原则策略模式总结第二章 观察者模式观察者模式设计原则自实现Java内置实现总结第三章 装饰者模式饮料问题设计原则装饰者模式总结 前言 本系列是《head first设计模式》设计模式的读书笔记,一包含一到三章,此书是不错的有关设计模式的入门书(代码是用java写的),推荐大家读一读。 第一章 设计模式入门 模拟鸭子游戏 创建 通过定义抽象的Duck,封装了统一的行为,并提供了显示颜色的接口。 public abstract cla

yuexiaqiying的博客 402

《Head First 设计模式》读书笔记

设计原则一:找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。 设计原则二:针对接口编程,而不是针对实现编程。 针对接口编程真正的意思是针对超类型(supertype)编程。这里的“接口”有多个含义,接口是一个“概念”,也是一种Java的Interface构造。针对接口编程,关键就在多态。利用多态,程序可以针对超类型编程,执行时会根据实际状况执行到真正的行为,不会被绑

cod0904的专栏 427

【Python】《Head First设计模式》读书笔记01: 《Head First设计模式》到底讲了什么?新手怎么学才不会从入门到放弃

Head First设计模式》帮你建立的是应对变化的思维框架。当你用Python实现一个个模式时,你会发现,语言的灵活性不是用来抛弃设计的,而是让你更优雅地实践设计原则。从策略模式开始,你会习惯性地问:“这里什么可能会变?”然后把变化抽离出去。坚持下去,三个月后,你的代码将充满弹性,而不再是一触即溃的“脆饼”。

933

【读书笔记】《Head First设计模式(中文版)》【TBC】

好久没看书了(怪不得你菜),源码又看不进去(好像你能看懂一样),来学学设计。上学的时候学过GoF四人组的设计模式,但是已经全还给老师了,一点都没剩。目前负责的这个系统,是我这个菜狗三年前从0开始搞的(刚毕业,感谢领导信任),经历了五六个开发同学的加工,现在已经是乱成一锅粥了。但生活还是要过下去,人一样,代码也一样,能好一点是一点(stop)。说回正题,听说这本写得非常不走寻常路,语言风趣幽默,引人入胜。看了个开头,名不虚传,经典就是经典。豆瓣链接:Head First 设计模式(中文版)..........

一气道盟王富贵儿 211

【设计模式】《Head First 设计模式》读书笔记——策略模式

写在前面:上个学期刚学了SSH,参加了几个竞赛写了几个小项目,但是也只是简单的套用SSH的套路,也不是很清楚为什么要用略显臃肿的框架,只听学长提起什么松耦合易维护,不是很理解为什么框架就可以做到这些。后来学长推荐了《Head First   设计模式》,暑假的时候粗略看了几章,看的时候就总有豁然开朗的感觉,噢~原来框架是通过这些设计模式来达到“松耦合”、“易维护”。开学之后白天上课,下课了跟着老师

terry_sdy的博客 497
上一篇: 获取Android各类系统相关信息的接口实现代码
下一篇: Dalvik虚拟机的优化机制
NewJerryj
博客等级 码龄19年 196粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值