auto commit
This commit is contained in:
parent
ee8b7f8375
commit
95f405f74a
|
@ -51,7 +51,7 @@
|
|||
|
||||
**4. 设计原则**
|
||||
|
||||
**封装变化** 在这里变化的是鸭子叫和飞行的行为方式。
|
||||
**封装变化** 在这里变化的是鸭子叫和飞行的行为方式。
|
||||
|
||||
**针对接口编程,而不是针对实现编程** 变量声明的类型为父类,而不是具体的某个子类。父类中的方法实现不在父类,而是在各个子类。程序在运行时可以动态改变变量所指向的子类类型。
|
||||
|
||||
|
@ -71,7 +71,7 @@
|
|||
|
||||
**6. 模式定义**
|
||||
|
||||
**策略模式** :定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
|
||||
**策略模式** 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
|
||||
|
||||
**7. 实现代码**
|
||||
|
||||
|
@ -318,13 +318,13 @@ StatisticsDisplay.update:1.0 1.0 1.0
|
|||
|
||||
动态地将责任附加到对象上。在扩展功能上,装饰者提供了比继承更有弹性的替代方案。
|
||||
|
||||
下图表示在 DarkRoast 饮料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 对象被 Mocha 包裹,Mocha 对象又被 Whip 包裹。它们都继承自相同父类,都有 cost() 方法,外层对象的 cost() 方法调用了内层对象的 cost() 方法。
|
||||
下图表示在 DarkRoast 饮料上新增新添加 Mocha 配料,之后又添加了 Whip 配料。DarkRoast 被 Mocha 包裹,Mocha 又被 Whip 包裹。它们都继承自相同父类,都有 cost() 方法,外层类的 cost() 方法调用了内层类的 cost() 方法。
|
||||
|
||||
<div align="center"> <img src="../pics//41a4cb30-f393-4b3b-abe4-9941ccf8fa1f.jpg"/> </div><br>
|
||||
|
||||
**3. 模式类图**
|
||||
|
||||
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件类型(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件类型,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰的对象之外,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
|
||||
装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
|
||||
|
||||
<div align="center"> <img src="../pics//3dc454fb-efd4-4eb8-afde-785b2182caeb.jpg"/> </div><br>
|
||||
|
||||
|
@ -962,23 +962,15 @@ Light is on!
|
|||
|
||||
**2. 模式类图**
|
||||
|
||||
适配器模式有两种实现方式,一种是对象方式,一种是类方式。
|
||||
|
||||
对象方式是通过组合的方法,让适配器类(Adapter)拥有一个待适配的对象(Adaptee),Adapter 把操作委托给 Adaptee。
|
||||
适配器类(Adapter)组合一个待适配的对象(Adaptee),Adapter 把操作委托给 Adaptee。
|
||||
|
||||
<div align="center"> <img src="../pics//253bd869-ea48-4092-9aed-6906ccb2f3b0.jpg"/> </div><br>
|
||||
|
||||
|
||||
类方式用到多重继承,Adapter 继承 Target 和 Adaptee,先把 Adapter 当成 Adaptee 类型然后实例化一个对象,再把它当成 Target 类型的,这样 Client 就可以把这个对象当成 Target 的对象来处理,同时拥有 Adaptee 的方法。
|
||||
|
||||
|
||||
<div align="center"> <img src="../pics//a797959a-0ed5-475b-8d97-df157c672019.jpg"/> </div><br>
|
||||
|
||||
**3. 问题描述**
|
||||
|
||||
鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 调用的是 quack() 方法,而 Turkey 调用 gobble() 方法。
|
||||
鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。
|
||||
|
||||
要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子。
|
||||
要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子!
|
||||
|
||||
**4. 解决方案类图**
|
||||
|
||||
|
@ -1038,10 +1030,6 @@ public class DuckTestDrive {
|
|||
gobble!
|
||||
```
|
||||
|
||||
**6. Enumration 适配成 Iterator**
|
||||
|
||||
<div align="center"> <img src="../pics//aa340e1a-f366-436b-a5a5-29a90425c10d.png"/> </div><br>
|
||||
|
||||
# 外观模式
|
||||
|
||||
**1. 模式定义**
|
||||
|
@ -1050,13 +1038,13 @@ gobble!
|
|||
|
||||
**2. 模式类图**
|
||||
|
||||
<div align="center"> <img src="../pics//78f2314e-2643-41df-8f3d-b7e28294094b.jpg"/> </div><br>
|
||||
<div align="center"> <img src="../pics//78f2314e-2643-41df-8f3d-b7e28294094b.jpg" width="1000"/> </div><br>
|
||||
|
||||
**3. 问题描述**
|
||||
|
||||
家庭影院中有众多电器,当要进行观看电影时需要对很多电器进行操作。要求简化这些操作,使得家庭影院类只提供一个简化的接口,例如提供一个看电影相关的接口。
|
||||
|
||||
<div align="center"> <img src="../pics//106f5585-b2e7-4718-be5d-3b322d1ef42a.jpg"/> </div><br>
|
||||
<div align="center"> <img src="../pics//106f5585-b2e7-4718-be5d-3b322d1ef42a.jpg" width="500"/> </div><br>
|
||||
|
||||
**4. 解决方案类图**
|
||||
|
||||
|
@ -1064,7 +1052,7 @@ gobble!
|
|||
|
||||
**5. 设计原则**
|
||||
|
||||
**最少知识原则** :只和你的密友谈话。也就是应当使得客户对象所需要交互的对象尽可能少。
|
||||
**最少知识原则** :只和你的密友谈话。也就是客户对象所需要交互的对象应当尽可能少。
|
||||
|
||||
**6. 代码实现**
|
||||
|
||||
|
@ -1090,9 +1078,9 @@ gobble!
|
|||
|
||||
<div align="center"> <img src="../pics//d8f873fc-00bc-41ee-a87c-c1b4c0172844.png"/> </div><br>
|
||||
|
||||
**4. 解决方案类图**
|
||||
**4. 问题的解决方案类图**
|
||||
|
||||
其中 prepareRecipe() 方法就是模板方法,它确定了其它四个方法的具体执行步骤。其中 brew() 和 addCondiments() 方法在子类中实现。
|
||||
prepareRecipe() 方法就是模板方法,它确定了其它四个方法的具体执行步骤。其中 brew() 和 addCondiments() 方法在子类中实现。
|
||||
|
||||
<div align="center"> <img src="../pics//aa20c123-b6b5-432a-83d3-45dc39172192.jpg"/> </div><br>
|
||||
|
||||
|
@ -1196,7 +1184,7 @@ Tea.addCondiments
|
|||
|
||||
- Iterator 主要定义了 hasNext() 和 next() 方法。
|
||||
|
||||
- Client 需要拥有一个 Aggregate 对象,这是很明显的。为了迭代变量 Aggregate 对象,也需要拥有 Iterator 对象。
|
||||
- Client 组合了 Aggregate 对象,为了迭代遍历 Aggregate 对象,也需要组合 Iterator 对象。
|
||||
|
||||
<div align="center"> <img src="../pics//439deca7-fed0-4c89-87e5-7088d10f1fdb.jpg"/> </div><br>
|
||||
|
||||
|
@ -1276,9 +1264,9 @@ public class Client {
|
|||
|
||||
**4. Java 内置的迭代器**
|
||||
|
||||
在使用 Java 的迭代器实现时,需要让聚合对象去实现 Iterable 接口,该接口有一个 iterator() 方法会返回一个 Iterator 对象。
|
||||
需要让聚合类实现 Iterable 接口,该接口有一个 iterator() 方法会返回一个 Iterator 对象。
|
||||
|
||||
使用 Java 内置的迭代器实现,客户对象可以使用 foreach 循环来遍历聚合对象中的每个元素。
|
||||
可以使用 foreach 循环来顺序访问聚合对象中的每个元素。
|
||||
|
||||
Java 中的集合类基本都实现了 Iterable 接口。
|
||||
|
||||
|
@ -1340,11 +1328,11 @@ public class Client {
|
|||
|
||||
**1. 设计原则**
|
||||
|
||||
一个类应该只有一个引起改变的原因。
|
||||
一个类应该只有一个引起它改变的原因。
|
||||
|
||||
**2. 模式定义**
|
||||
|
||||
允许将对象组合成树形结构来表现“整体/部分”层次结构。
|
||||
允许将对象组合成树形结构来表现“整体/部分”关系。
|
||||
|
||||
组合能让客户以一致的方式处理个别对象以及组合对象。
|
||||
|
||||
|
@ -1352,7 +1340,7 @@ public class Client {
|
|||
|
||||
组件(Component)类是组合类(Composite)和叶子类(Leaf)的父类,可以把组合类看成是树的中间节点。
|
||||
|
||||
组合类拥有一个组件对象,因此组合类的操作可以委托给组件对象去处理,而组件对象可以是另一个组合类或者叶子类。
|
||||
组合对象拥有一个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。
|
||||
|
||||
<div align="center"> <img src="../pics//cf08a51d-14c0-4bfc-863b-c8672d9c2b02.jpg"/> </div><br>
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user