HeadFirst 设计模式(1)综述
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
设计原则4:开-闭原则
• Strategy模式对“开-闭”原则的支持
设计原则4:开-闭原则
• 玉帝遵照“开-闭”原则维护天庭秩序
– 当年孙悟空大闹天空,向天庭发出挑战:“皇帝轮流 做,明年到我家......只教他搬出去,将天宫让与我!” – 太白金星给玉皇大帝 建议道:“降一道招安 圣旨,把他宣来上界... 与他籍名在箓... 一则不动众劳师, 二则收仙有道也。”
• 使用“组合”思路考虑问题
– “汽车”拥有某种或某些“用途” – “汽车”和“用途”独立变化,互不影响
可维护+可扩展+可复用
松耦合 高内聚. OOP: 封装,继承,多态
设 计 模 式
封 闭 开 放 封 装 变 化 面 向 接 口 组 合 复 用 依 赖 倒 置 里 氏 法 则 迪 米 特
逻辑 。。。 物理 一致
能否用封装原理表述?
设计原则1:封装可变性
识别程序中可变的特征, 并将它们与不变的特征分离开来
逻辑相关,物理封装
设计原则1:封装可变性
识别程序中可变的特征, 并将它们与不变的特征分离开来
现实中的封装可变性
维护, 扩展, 复用?
策略模式的优点
• (1)策略模式提供了管理相关的算法族的办 法。
• 继承复用 • 优点 可以很容易的修改或扩展父类的实现
设计原则3:组合优先
• 继承复用的缺点
– 继承破坏封装,因为父类的实现细节完全暴露给子类 (白盒复用) – 父类的实现发生改变,则子类必受牵连 – 继承是静态的,不能在运行时发生改变,不灵活
设计原则3:组合优先
• 组合复用的优点
– 不破坏封装,这种复用是黑盒复用,因为成员对象的内部细 节对新对象保密 – 所需依赖少(只依赖接口) – 可以把成员对象动态替换为另一个类型相同的对象
设计原则4:开-闭原则
• 分析
– “不动众劳师”、不破坏天规就是“闭” – 收仙有道就是“开” – 招安,就是玉帝的“开-闭”原则:既让孙悟空满意, 又不必更改天庭现有的秩序
设计原则4:开-闭原则
• 分析
– 现有的天庭秩序是系统的最高抽象层 – 弼马温这个职位只是具体的实现层 – 招安的关键就是不允许更改现有的天庭秩序, 但是允许将妖猴纳入到文武百官中,从而扩展 了这一秩序的具体实现
• (2)策略模式提供了可以替换继承关系的办 法。 • (3)使用策略模式可以避免使用多重条件转 移语句。
策略模式的缺点
• (1) 客户端必须知道所有的策略类,并自行 决定使用哪一个策略类。
• (2)策略模式造成很多的策略类, 增加了对 象的数目。 • (3)增加了通信开销
在什么情况下应当使用策略模式
设计原则2:针对接口编程,而非针对实现
接口使可插入性变得可能。
1. Client不必知道其使用对象的具体所属类。 2. 一个对象可以很容易地被(实现了相同接口的)的另 一个对象所替换。 3. 对象间的连接不必硬绑定(hardwire)到一个具体类 的对象上,因此增加了灵活性。 4. 松散藕合(loosens coupling)。 5. 增加了重用的可能性。 6. 提高了(对象)组合的机率,因为被包含对象可以是 任何实现了一个指定接口的类。
补充 设计原则4:开-闭原则
• “开-闭”原则
– Bertrand Meyer: “Software should be open for extension, but closed for modification” – 软件应该对扩展开放, 对修改关闭
• 解释
– 在设计一个软件的时候,应当使这个软件可以在不被 修改的前提下扩展 – 已有模块,尤其是最重要的抽象层模块不能动:保证 稳定性和延续性 – 可以扩展新模块:增加新行为,保证灵活性
设计 模式
封 闭 开 放 封 装 变 化
策略模式
面 向 接 口
组 合 复 用
里 氏 法 则
依 赖 倒 置
迪 米 特
逻辑 。。。 物理 一致
设计原则3:组合优先
• 组合复用的缺点
– 对象数量会增加 – 使用委托(delegation)会使得系统复杂
设计原则3:组合优先
• 例:汽车有很多种,小轿车、货车、客车,有的 车是客货两用,有的车水陆两用 • 如果使用继承来描述:
– 一旦增加新的汽车种类 或用途,都需要大量改动 原有代码
设计原则3:组合优先
• HP Technical Service
再增加新鸭?
设计原则1:封装可变性
识别程序中可变的特征, 并将它们与不变的特征分离开来
GOF:“考虑你的设计中什么可能会发生变化......考虑你
允许什么发生变化而不让这一变化导致重新设计” – 一种可变性不应散落在代码的很多角落 – 一种可变性不应当与另一种可变性混合在一起
可维护+可扩展+可复用
松耦合 高内聚. OOP: 封装,继承,多态
设 计 模 式
封 闭 开 放 封 装 变 化 面 向 接 口 组 合 复 用 依 赖 倒 置 里 氏 法 则 迪 米 特
逻辑 。。。 物理 一致
设计原则3: 组合优先
组合(has a)比继承(is a)更好一些
设计原则3: 组合优先
3增加了通信开销在什么情况下应当使用策略模式1如果在一个系统里面有许多类它们之间的区别仅在于它们的行为那么使用策略模式可以动态地让一个对象在许多行为中选择一种行为
Design Pattern (设计模式)
第一章: Strategy Pattern 策略模式
• • Wang Ying-hong Technical Consultant
设计原则4:开-闭原则
• Bertrand Meyer
– 对象技术大师 – 法国工程院院士 – 苏黎世工学院计算机系教授 – 发明了Eiffel语言和按契约设计 Design by Contract)的思想 – 早年参与了Z形式语言的设计 – 名著《面向对象软件构造》
可维护可扩展可复用灵活性
松耦合 高内聚. OOP: 封装,继承,多态
• (1)如果在一个系统里面有许多类,它们之间的 区别仅在于它们的行为,那么使用策略模式可以 动态地让一个对象在许多行为中选择一种行为。 • (2)一个系统需要动态地在几种算法中选择一种。 • (3)一个系统的算法使用的数据不可以让客户端 知道。 • (4)如果一个对象有很多的行为,如果不用恰当 的模式,这些行为就只好使用多重的条件选择语 句来实现。
• 策略模式中体现了多个设计原则
设计原则1: 封装变化
可维护+可扩展+可复用
松耦合 高内聚. OOP: 封装,继承,多态
设 计 模 式
封 闭 开 放 封 装 变 化 面 向 接 口 组 合 复 用 依 赖 倒 置 里 氏 法 则 迪 米 特
逻辑 。。。 物理 一致
设计原则2:针对接口编程,而非针对实现