auto commit

This commit is contained in:
CyC2018
2019-11-02 12:07:41 +08:00
parent 182e1440a4
commit bb6e0df82d
784 changed files with 7545 additions and 2827 deletions

View File

@ -1,36 +1,4 @@
<!-- GFM-TOC -->
* [概述](#一概述)
* [创建型](#二创建型)
* [1. 单例Singleton](#1-单例singleton)
* [2. 简单工厂Simple Factory](#2-简单工厂simple-factory)
* [3. 工厂方法Factory Method](#3-工厂方法factory-method)
* [4. 抽象工厂Abstract Factory](#4-抽象工厂abstract-factory)
* [5. 生成器Builder](#5-生成器builder)
* [6. 原型模式Prototype](#6-原型模式prototype)
* [行为型](#三行为型)
* [1. 责任链Chain Of Responsibility](#1-责任链chain-of-responsibility)
* [2. 命令Command](#2-命令command)
* [3. 解释器Interpreter](#3-解释器interpreter)
* [4. 迭代器Iterator](#4-迭代器iterator)
* [5. 中介者Mediator](#5-中介者mediator)
* [6. 备忘录Memento](#6-备忘录memento)
* [7. 观察者Observer](#7-观察者observer)
* [8. 状态State](#8-状态state)
* [9. 策略Strategy](#9-策略strategy)
* [10. 模板方法Template Method](#10-模板方法template-method)
* [11. 访问者Visitor](#11-访问者visitor)
* [12. 空对象Null](#12-空对象null)
* [结构型](#四结构型)
* [1. 适配器Adapter](#1-适配器adapter)
* [2. 桥接Bridge](#2-桥接bridge)
* [3. 组合Composite](#3-组合composite)
* [4. 装饰Decorator](#4-装饰decorator)
* [5. 外观Facade](#5-外观facade)
* [6. 享元Flyweight](#6-享元flyweight)
* [7. 代理Proxy](#7-代理proxy)
* [参考资料](#参考资料)
<!-- GFM-TOC -->
[TOC]
# 概述
@ -52,7 +20,7 @@
私有构造函数保证了不能通过构造函数来创建对象实例只能通过公有静态函数返回唯一的私有静态变量
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/eca1f422-8381-409b-ad04-98ef39ae38ba.png"/> </div><br>
![](pics/eca1f422-8381-409b-ad04-98ef39ae38ba.png)
### Implementation
@ -253,7 +221,7 @@ secondName
这样做能把客户类和具体子类的实现解耦客户类不再需要知道有哪些子类以及应当实例化哪个子类客户类往往有多个如果不使用简单工厂那么所有的客户类都要知道所有子类的细节而且一旦子类发生改变例如增加子类那么所有的客户类都要进行修改
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/40c0c17e-bba6-4493-9857-147c0044a018.png"/> </div><br>
![](pics/40c0c17e-bba6-4493-9857-147c0044a018.png)
### Implementation
@ -336,7 +304,7 @@ public class Client {
下图中Factory 有一个 doSomething() 方法这个方法需要用到一个产品对象这个产品对象由 factoryMethod() 方法创建该方法是抽象的需要由子类去实现
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/f4d0afd0-8e78-4914-9e60-4366eaf065b5.png"/> </div><br>
![](pics/f4d0afd0-8e78-4914-9e60-4366eaf065b5.png)
### Implementation
@ -400,7 +368,7 @@ public class ConcreteFactory2 extends Factory {
从高层次来看抽象工厂使用了组合 Cilent 组合了 AbstractFactory而工厂方法模式使用了继承
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/e2190c36-8b27-4690-bde5-9911020a1294.png"/> </div><br>
![](pics/e2190c36-8b27-4690-bde5-9911020a1294.png)
### Implementation
@ -490,7 +458,7 @@ public class Client {
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/db5e376d-0b3e-490e-a43a-3231914b6668.png"/> </div><br>
![](pics/db5e376d-0b3e-490e-a43a-3231914b6668.png)
### Implementation
@ -580,7 +548,7 @@ abcdefghijklmnopqrstuvwxyz
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/b8922f8c-95e6-4187-be85-572a509afb71.png"/> </div><br>
![](pics/b8922f8c-95e6-4187-be85-572a509afb71.png)
### Implementation
@ -641,7 +609,7 @@ abc
- Handler定义处理请求的接口并且实现后继链successor
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/ca9f23bf-55a4-47b2-9534-a28e35397988.png"/> </div><br>
![](pics/ca9f23bf-55a4-47b2-9534-a28e35397988.png)
### Implementation
@ -779,13 +747,13 @@ request2 is handle by ConcreteHandler2
- Invoker通过它来调用命令
- Client可以设置命令与命令的接收者
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/c44a0342-f405-4f17-b750-e27cf4aadde2.png"/> </div><br>
![](pics/c44a0342-f405-4f17-b750-e27cf4aadde2.png)
### Implementation
设计一个遥控器可以控制电灯开关
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/e6bded8e-41a0-489a-88a6-638e88ab7666.jpg"/> </div><br>
![](pics/e6bded8e-41a0-489a-88a6-638e88ab7666.jpg)
```java
public interface Command {
@ -900,7 +868,7 @@ public class Client {
- TerminalExpression终结符表达式每个终结符都需要一个 TerminalExpression
- Context上下文包含解释器之外的一些全局信息
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/2b125bcd-1b36-43be-9b78-d90b076be549.png"/> </div><br>
![](pics/2b125bcd-1b36-43be-9b78-d90b076be549.png)
### Implementation
@ -1025,7 +993,7 @@ false
- Iterator 主要定义了 hasNext() next() 方法
- Client 组合了 Aggregate为了迭代遍历 Aggregate也需要组合 Iterator
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/89292ae1-5f13-44dc-b508-3f035e80bf89.png"/> </div><br>
![](pics/89292ae1-5f13-44dc-b508-3f035e80bf89.png)
### Implementation
@ -1114,17 +1082,17 @@ public class Client {
- Mediator中介者定义一个接口用于与各同事Colleague对象通信
- Colleague同事相关对象
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/30d6e95c-2e3c-4d32-bf4f-68128a70bc05.png"/> </div><br>
![](pics/30d6e95c-2e3c-4d32-bf4f-68128a70bc05.png)
### Implementation
Alarm闹钟CoffeePot咖啡壶Calendar日历Sprinkler喷头是一组相关的对象在某个对象的事件产生时需要去操作其它对象形成了下面这种依赖结构
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg"/> </div><br>
![](pics/82cfda3b-b53b-4c89-9fdb-26dd2db0cd02.jpg)
使用中介者模式可以将复杂的依赖结构变成星形结构
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg"/> </div><br>
![](pics/5359cbf5-5a79-4874-9b17-f23c53c2cb80.jpg)
```java
public abstract class Colleague {
@ -1284,7 +1252,7 @@ doSprinkler()
- Caretaker负责保存好备忘录
- Menento备忘录存储原始对象的的状态备忘录实际上有两个接口一个是提供给 Caretaker 的窄接口它只能将备忘录传递给其它对象一个是提供给 Originator 的宽接口允许它访问到先前状态所需的所有数据理想情况是只允许 Originator 访问本备忘录的内部状态
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/50678f34-694f-45a4-91c6-34d985c83fee.png"/> </div><br>
![](pics/50678f34-694f-45a4-91c6-34d985c83fee.png)
### Implementation
@ -1457,7 +1425,7 @@ public class Client {
主题Subject是被观察的对象而其所有依赖者Observer称为观察者
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/7a3c6a30-c735-4edb-8115-337288a4f0f2.jpg" width="600"/> </div><br>
<img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/7a3c6a30-c735-4edb-8115-337288a4f0f2.jpg" width="600"/>
### Class Diagram
@ -1465,13 +1433,13 @@ public class Client {
观察者Observer的注册功能需要调用主题的 registerObserver() 方法
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/a8c8f894-a712-447c-9906-5caef6a016e3.png"/> </div><br>
![](pics/a8c8f894-a712-447c-9906-5caef6a016e3.png)
### Implementation
天气数据布告板会在天气信息发生改变时更新其内容布告板有多个并且在将来会继续增加
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/b1df9732-86ce-4d69-9f06-fba1db7b3b5a.jpg"/> </div><br>
![](pics/b1df9732-86ce-4d69-9f06-fba1db7b3b5a.jpg)
```java
public interface Subject {
@ -1592,13 +1560,13 @@ StatisticsDisplay.update: 1.0 1.0 1.0
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/79df886f-fdc3-4020-a07f-c991bb58e0d8.png"/> </div><br>
![](pics/79df886f-fdc3-4020-a07f-c991bb58e0d8.png)
### Implementation
糖果销售机有多种状态每种状态下销售机有不同的行为状态可以发生转移使得销售机的行为也发生改变
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/396be981-3f2c-4fd9-8101-dbf9c841504b.jpg" width="600"/> </div><br>
<img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/396be981-3f2c-4fd9-8101-dbf9c841504b.jpg" width="600"/>
```java
public interface State {
@ -1899,7 +1867,7 @@ No gumball dispensed
- Strategy 接口定义了一个算法族它们都实现了 behavior() 方法
- Context 是使用到该算法族的类其中的 doSomething() 方法会调用 behavior()setStrategy(Strategy) 方法可以动态地改变 strategy 对象也就是说能动态地改变 Context 所使用的算法
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/cd1be8c2-755a-4a66-ad92-2e30f8f47922.png"/> </div><br>
![](pics/cd1be8c2-755a-4a66-ad92-2e30f8f47922.png)
### 与状态模式的比较
@ -1986,13 +1954,13 @@ quack!
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/ac6a794b-68c0-486c-902f-8d988eee5766.png"/> </div><br>
![](pics/ac6a794b-68c0-486c-902f-8d988eee5766.png)
### Implementation
冲咖啡和冲茶都有类似的流程但是某些步骤会有点不一样要求复用那些相同步骤的代码
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/11236498-1417-46ce-a1b0-e10054256955.png"/> </div><br>
![](pics/11236498-1417-46ce-a1b0-e10054256955.png)
```java
public abstract class CaffeineBeverage {
@ -2089,7 +2057,7 @@ Tea.addCondiments
- ConcreteVisitor具体访问者存储遍历过程中的累计结果
- ObjectStructure对象结构可以是组合结构或者是一个集合
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/79c6f036-bde6-4393-85a3-ef36a0327bd2.png"/> </div><br>
![](pics/79c6f036-bde6-4393-85a3-ef36a0327bd2.png)
### Implementation
@ -2294,7 +2262,7 @@ Number of items: 6
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/22870bbe-898f-4c17-a31a-d7c5ee5d1c10.png"/> </div><br>
![](pics/22870bbe-898f-4c17-a31a-d7c5ee5d1c10.png)
### Implementation
@ -2346,11 +2314,11 @@ public class Client {
把一个类接口转换成另一个用户需要的接口
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/3d5b828e-5c4d-48d8-a440-281e4a8e1c92.png"/> </div><br>
![](pics/3d5b828e-5c4d-48d8-a440-281e4a8e1c92.png)
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/ff5152fc-4ff3-44c4-95d6-1061002c364a.png"/> </div><br>
![](pics/ff5152fc-4ff3-44c4-95d6-1061002c364a.png)
### Implementation
@ -2422,7 +2390,7 @@ public class Client {
- Abstraction定义抽象类的接口
- Implementor定义实现类接口
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/2a1f8b0f-1dd7-4409-b177-a381c58066ad.png"/> </div><br>
![](pics/2a1f8b0f-1dd7-4409-b177-a381c58066ad.png)
### Implementation
@ -2580,7 +2548,7 @@ public class Client {
组合对象拥有一个或者多个组件对象因此组合对象的操作可以委托给组件对象去处理而组件对象可以是另一个组合对象或者叶子对象
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/2b8bfd57-b4d1-4a75-bfb0-bcf1fba4014a.png"/> </div><br>
![](pics/2b8bfd57-b4d1-4a75-bfb0-bcf1fba4014a.png)
### Implementation
@ -2712,7 +2680,7 @@ Composite:root
装饰者Decorator和具体组件ConcreteComponent都继承自组件Component具体组件的方法实现不需要依赖于其它对象而装饰者组合了一个组件这样它可以装饰其它装饰者或者具体组件所谓装饰就是把这个装饰者套在被装饰者之上从而动态扩展被装饰者的功能装饰者的方法有一部分是自己的这属于它的功能然后调用被装饰者的方法实现从而也保留了被装饰者的功能可以看到具体组件应当是装饰层次的最低层因为只有具体组件的方法实现不需要依赖于其它对象
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/6b833bc2-517a-4270-8a5e-0a5f6df8cd96.png"/> </div><br>
![](pics/6b833bc2-517a-4270-8a5e-0a5f6df8cd96.png)
### Implementation
@ -2720,7 +2688,7 @@ Composite:root
下图表示在 DarkRoast 饮料上新增新添加 Mocha 配料之后又添加了 Whip 配料DarkRoast Mocha 包裹Mocha 又被 Whip 包裹它们都继承自相同父类都有 cost() 方法外层类的 cost() 方法调用了内层类的 cost() 方法
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/c9cfd600-bc91-4f3a-9f99-b42f88a5bb24.jpg" width="600"/> </div><br>
<img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/c9cfd600-bc91-4f3a-9f99-b42f88a5bb24.jpg" width="600"/>
```java
public interface Beverage {
@ -2818,7 +2786,7 @@ public class Client {
### Class Diagram
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/f9978fa6-9f49-4a0f-8540-02d269ac448f.png"/> </div><br>
![](pics/f9978fa6-9f49-4a0f-8540-02d269ac448f.png)
### Implementation
@ -2877,7 +2845,7 @@ public class Client {
- IntrinsicState内部状态享元对象共享内部状态
- ExtrinsicState外部状态每个享元对象的外部状态不同
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/5f5c22d5-9c0e-49e1-b5b0-6cc7032724d4.png"/> </div><br>
![](pics/5f5c22d5-9c0e-49e1-b5b0-6cc7032724d4.png)
### Implementation
@ -2966,7 +2934,7 @@ Java 利用缓存来加速大量小对象的访问时间。
- 保护代理Protection Proxy按权限控制对象的访问它负责检查调用者是否具有实现一个请求所必须的访问权限
- 智能代理Smart Reference取代了简单的指针它在访问对象时执行一些附加操作记录对象的引用次数当第一次引用一个对象时将它装入内存在访问一个实际对象前检查是否已经锁定了它以确保其它对象不能改变它
<div align="center"> <img src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/9b679ff5-94c6-48a7-b9b7-2ea868e828ed.png"/> </div><br>
![](pics/9b679ff5-94c6-48a7-b9b7-2ea868e828ed.png)
### Implementation
@ -3064,10 +3032,3 @@ public class ImageViewer {
- [Design Patterns](http://www.oodesign.com/)
- [Design patterns implemented in Java](http://java-design-patterns.com/)
- [The breakdown of design patterns in JDK](http://www.programering.com/a/MTNxAzMwATY.html)
<div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/githubio/公众号二维码-1.png"></img></div>