auto commit

This commit is contained in:
CyC2018 2018-03-16 23:24:10 +08:00
parent ee8b7f8375
commit 95f405f74a

View File

@ -51,7 +51,7 @@
**4. 设计原则** **4. 设计原则**
**封装变化** 在这里变化的是鸭子叫和飞行的行为方式。 **封装变化** 在这里变化的是鸭子叫和飞行的行为方式。
**针对接口编程,而不是针对实现编程** 变量声明的类型为父类,而不是具体的某个子类。父类中的方法实现不在父类,而是在各个子类。程序在运行时可以动态改变变量所指向的子类类型。 **针对接口编程,而不是针对实现编程** 变量声明的类型为父类,而不是具体的某个子类。父类中的方法实现不在父类,而是在各个子类。程序在运行时可以动态改变变量所指向的子类类型。
@ -71,7 +71,7 @@
**6. 模式定义** **6. 模式定义**
**策略模式** 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。 **策略模式** 定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
**7. 实现代码** **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> <div align="center"> <img src="../pics//41a4cb30-f393-4b3b-abe4-9941ccf8fa1f.jpg"/> </div><br>
**3. 模式类图** **3. 模式类图**
装饰者Decorator和具体组件ConcreteComponent都继承自组件类型Component具体组件的方法实现不需要依赖于其它对象而装饰者组合了一个组件类型,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰的对象之外,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。 装饰者Decorator和具体组件ConcreteComponent都继承自组件Component具体组件的方法实现不需要依赖于其它对象而装饰者组合了一个组件这样它可以装饰其它装饰者或者具体组件。所谓装饰就是把这个装饰者套在被装饰,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。
<div align="center"> <img src="../pics//3dc454fb-efd4-4eb8-afde-785b2182caeb.jpg"/> </div><br> <div align="center"> <img src="../pics//3dc454fb-efd4-4eb8-afde-785b2182caeb.jpg"/> </div><br>
@ -962,23 +962,15 @@ Light is on!
**2. 模式类图** **2. 模式类图**
适配器模式有两种实现方式,一种是对象方式,一种是类方式。 适配器类Adapter组合一个待适配的对象AdapteeAdapter 把操作委托给 Adaptee。
对象方式是通过组合的方法让适配器类Adapter拥有一个待适配的对象AdapteeAdapter 把操作委托给 Adaptee。
<div align="center"> <img src="../pics//253bd869-ea48-4092-9aed-6906ccb2f3b0.jpg"/> </div><br> <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. 问题描述** **3. 问题描述**
鸭子Duck和火鸡Turkey拥有不同的叫声Duck 调用的是 quack() 方法,而 Turkey 调用 gobble() 方法。 鸭子Duck和火鸡Turkey拥有不同的叫声Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。
要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子 要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子!
**4. 解决方案类图** **4. 解决方案类图**
@ -1038,10 +1030,6 @@ public class DuckTestDrive {
gobble! gobble!
``` ```
**6. Enumration 适配成 Iterator**
<div align="center"> <img src="../pics//aa340e1a-f366-436b-a5a5-29a90425c10d.png"/> </div><br>
# 外观模式 # 外观模式
**1. 模式定义** **1. 模式定义**
@ -1050,13 +1038,13 @@ gobble!
**2. 模式类图** **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. 问题描述** **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. 解决方案类图** **4. 解决方案类图**
@ -1064,7 +1052,7 @@ gobble!
**5. 设计原则** **5. 设计原则**
**最少知识原则** :只和你的密友谈话。也就是应当使得客户对象所需要交互的对象尽可能少。 **最少知识原则** :只和你的密友谈话。也就是客户对象所需要交互的对象应当尽可能少。
**6. 代码实现** **6. 代码实现**
@ -1090,9 +1078,9 @@ gobble!
<div align="center"> <img src="../pics//d8f873fc-00bc-41ee-a87c-c1b4c0172844.png"/> </div><br> <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> <div align="center"> <img src="../pics//aa20c123-b6b5-432a-83d3-45dc39172192.jpg"/> </div><br>
@ -1196,7 +1184,7 @@ Tea.addCondiments
- Iterator 主要定义了 hasNext() 和 next() 方法。 - 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> <div align="center"> <img src="../pics//439deca7-fed0-4c89-87e5-7088d10f1fdb.jpg"/> </div><br>
@ -1276,9 +1264,9 @@ public class Client {
**4. Java 内置的迭代器** **4. Java 内置的迭代器**
在使用 Java 的迭代器实现时,需要让聚合对象去实现 Iterable 接口,该接口有一个 iterator() 方法会返回一个 Iterator 对象。 需要让聚合类实现 Iterable 接口,该接口有一个 iterator() 方法会返回一个 Iterator 对象。
使用 Java 内置的迭代器实现,客户对象可以使用 foreach 循环来遍历聚合对象中的每个元素。 可以使用 foreach 循环来顺序访问聚合对象中的每个元素。
Java 中的集合类基本都实现了 Iterable 接口。 Java 中的集合类基本都实现了 Iterable 接口。
@ -1340,11 +1328,11 @@ public class Client {
**1. 设计原则** **1. 设计原则**
一个类应该只有一个引起改变的原因。 一个类应该只有一个引起改变的原因。
**2. 模式定义** **2. 模式定义**
允许将对象组合成树形结构来表现“整体/部分”层次结构 允许将对象组合成树形结构来表现“整体/部分”关系
组合能让客户以一致的方式处理个别对象以及组合对象。 组合能让客户以一致的方式处理个别对象以及组合对象。
@ -1352,7 +1340,7 @@ public class Client {
组件Component类是组合类Composite和叶子类Leaf的父类可以把组合类看成是树的中间节点。 组件Component类是组合类Composite和叶子类Leaf的父类可以把组合类看成是树的中间节点。
组合类拥有一个组件对象,因此组合类的操作可以委托给组件对象去处理,而组件对象可以是另一个组合类或者叶子类 组合对象拥有一个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象
<div align="center"> <img src="../pics//cf08a51d-14c0-4bfc-863b-c8672d9c2b02.jpg"/> </div><br> <div align="center"> <img src="../pics//cf08a51d-14c0-4bfc-863b-c8672d9c2b02.jpg"/> </div><br>