diff --git a/notes/设计模式.md b/notes/设计模式.md index 9c03f64e..45ab7212 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -20,7 +20,7 @@ * [10. 访问者模式](#10-访问者模式) * [11. 空对象模式](#11-空对象模式) * [四、结构型](#四结构型) - * [1. 适配器](#1-适配器) + * [1. 适配器模式](#1-适配器模式) * [2. 桥接模式](#2-桥接模式) * [3. 组合模式](#3-组合模式) * [4. 装饰者模式](#4-装饰者模式) @@ -50,7 +50,7 @@ 私有构造函数保证了不能通过构造函数来创建对象实例,只能通过公有静态函数返回唯一的私有静态变量。 -

+

### 实现 @@ -203,7 +203,7 @@ public class Singleton implements Serializable{ 简单工厂不是设计模式,更像是一种编程习惯。它把实例化的操作单独放到一个类中,这个类就成为简单工厂类,让简单工厂类来决定应该用哪个子类来实例化。 -

+

这样做能把客户类和具体子类的实现解耦,客户类不再需要知道有哪些子类以及应当实例化哪个子类。因为客户类往往有多个,如果不使用简单工厂,所有的客户类都要知道所有子类的细节。而且一旦子类发生改变,例如增加子类,那么所有的客户类都要进行修改。 @@ -281,7 +281,7 @@ public class Client { 下图中,Factory 有一个 doSomethind() 方法,这个方法需要用到一组产品对象,这组产品对象由 factoryMethod() 方法创建。该方法是抽象的,需要由子类去实现。 -

+

### 实现 @@ -337,7 +337,7 @@ public class ConcreteFactory2 extends Factory { ### 类图 -

+

抽象工厂模式创建的是对象家族,也就是很多对象而不是一个对象,并且这些对象是相关的,也就是说必须一起创建出来。而工厂模式只是用于创建一个对象,这和抽象工厂模式有很大不同。 @@ -584,12 +584,70 @@ public class Client { # 四、结构型 -## 1. 适配器 +## 1. 适配器模式 ### 意图 把一个类接口转换成另一个用户需要的接口。 +

+ +### 类图 + +

+ +### 实现 + +鸭子(Duck)和火鸡(Turkey)拥有不同的叫声,Duck 的叫声调用 quack() 方法,而 Turkey 调用 gobble() 方法。 + +要求将 Turkey 的 gobble() 方法适配成 Duck 的 quack() 方法,从而让火鸡冒充鸭子! + +```java +public interface Duck { + void quack(); +} +``` + +```java +public interface Turkey { + void gobble(); +} +``` + +```java +public class WildTurkey implements Turkey { + @Override + public void gobble() { + System.out.println("gobble!"); + } +} +``` + +```java +public class TurkeyAdapter implements Duck { + Turkey turkey; + + public TurkeyAdapter(Turkey turkey) { + this.turkey = turkey; + } + + @Override + public void quack() { + turkey.gobble(); + } +} +``` + +```java +public class Client { + public static void main(String[] args) { + Turkey turkey = new WildTurkey(); + Duck duck = new TurkeyAdapter(turkey); + duck.quack(); + } +} +``` + ### JDK - [java.util.Arrays#asList()](http://docs.oracle.com/javase/8/docs/api/java/util/Arrays.html#asList%28T...%29) diff --git a/pics/0f754c1d-b5cb-48cd-90e0-4a86034290a1.png b/pics/0f754c1d-b5cb-48cd-90e0-4a86034290a1.png new file mode 100644 index 00000000..57dd8bf1 Binary files /dev/null and b/pics/0f754c1d-b5cb-48cd-90e0-4a86034290a1.png differ diff --git a/pics/1818e141-8700-4026-99f7-900a545875f5.png b/pics/1818e141-8700-4026-99f7-900a545875f5.png new file mode 100644 index 00000000..1523ad79 Binary files /dev/null and b/pics/1818e141-8700-4026-99f7-900a545875f5.png differ diff --git a/pics/3d5b828e-5c4d-48d8-a440-281e4a8e1c92.png b/pics/3d5b828e-5c4d-48d8-a440-281e4a8e1c92.png new file mode 100644 index 00000000..2f39530c Binary files /dev/null and b/pics/3d5b828e-5c4d-48d8-a440-281e4a8e1c92.png differ diff --git a/pics/562f2844-d77c-40e0-887a-28a7128abd42.png b/pics/562f2844-d77c-40e0-887a-28a7128abd42.png new file mode 100644 index 00000000..b74f69b7 Binary files /dev/null and b/pics/562f2844-d77c-40e0-887a-28a7128abd42.png differ diff --git a/pics/c79da808-0f28-4a36-bc04-33ccc5b83c13.png b/pics/c79da808-0f28-4a36-bc04-33ccc5b83c13.png new file mode 100644 index 00000000..91e2c144 Binary files /dev/null and b/pics/c79da808-0f28-4a36-bc04-33ccc5b83c13.png differ diff --git a/pics/e82e0454-4ece-435e-945f-90bc0d37bf44.png b/pics/e82e0454-4ece-435e-945f-90bc0d37bf44.png new file mode 100644 index 00000000..74a9f8b6 Binary files /dev/null and b/pics/e82e0454-4ece-435e-945f-90bc0d37bf44.png differ