diff --git a/notes/设计模式.md b/notes/设计模式.md index fcbfac84..3016b936 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -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() 方法。

**3. 模式类图** -装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件类型(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件类型,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰的对象之外,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。 +装饰者(Decorator)和具体组件(ConcreteComponent)都继承自组件(Component),具体组件的方法实现不需要依赖于其它对象,而装饰者组合了一个组件,这样它可以装饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰上,从而动态扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然后调用被装饰者的方法实现,从而也保留了被装饰者的功能。可以看到,具体组件应当是装饰层次的最低层,因为只有具体组件的方法实现不需要依赖于其它对象。

@@ -962,23 +962,15 @@ Light is on! **2. 模式类图** -适配器模式有两种实现方式,一种是对象方式,一种是类方式。 - -对象方式是通过组合的方法,让适配器类(Adapter)拥有一个待适配的对象(Adaptee),Adapter 把操作委托给 Adaptee。 +适配器类(Adapter)组合一个待适配的对象(Adaptee),Adapter 把操作委托给 Adaptee。

- -类方式用到多重继承,Adapter 继承 Target 和 Adaptee,先把 Adapter 当成 Adaptee 类型然后实例化一个对象,再把它当成 Target 类型的,这样 Client 就可以把这个对象当成 Target 的对象来处理,同时拥有 Adaptee 的方法。 - - -

- **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** - -

- # 外观模式 **1. 模式定义** @@ -1050,13 +1038,13 @@ gobble! **2. 模式类图** -

+

**3. 问题描述** 家庭影院中有众多电器,当要进行观看电影时需要对很多电器进行操作。要求简化这些操作,使得家庭影院类只提供一个简化的接口,例如提供一个看电影相关的接口。 -

+

**4. 解决方案类图** @@ -1064,7 +1052,7 @@ gobble! **5. 设计原则** -**最少知识原则** :只和你的密友谈话。也就是应当使得客户对象所需要交互的对象尽可能少。 +**最少知识原则** :只和你的密友谈话。也就是客户对象所需要交互的对象应当尽可能少。 **6. 代码实现** @@ -1090,9 +1078,9 @@ gobble!

-**4. 解决方案类图** +**4. 问题的解决方案类图** -其中 prepareRecipe() 方法就是模板方法,它确定了其它四个方法的具体执行步骤。其中 brew() 和 addCondiments() 方法在子类中实现。 +prepareRecipe() 方法就是模板方法,它确定了其它四个方法的具体执行步骤。其中 brew() 和 addCondiments() 方法在子类中实现。

@@ -1196,7 +1184,7 @@ Tea.addCondiments - Iterator 主要定义了 hasNext() 和 next() 方法。 -- Client 需要拥有一个 Aggregate 对象,这是很明显的。为了迭代变量 Aggregate 对象,也需要拥有 Iterator 对象。 +- Client 组合了 Aggregate 对象,为了迭代遍历 Aggregate 对象,也需要组合 Iterator 对象。

@@ -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)的父类,可以把组合类看成是树的中间节点。 -组合类拥有一个组件对象,因此组合类的操作可以委托给组件对象去处理,而组件对象可以是另一个组合类或者叶子类。 +组合对象拥有一个组件对象,因此组合对象的操作可以委托给组件对象去处理,而组件对象可以是另一个组合对象或者叶子对象。