# design_pattern_via_java
**Repository Path**: killssouss/design_pattern_via_java
## Basic Information
- **Project Name**: design_pattern_via_java
- **Description**: 设计模式 Java版本
- **Primary Language**: Java
- **License**: GPL-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 4
- **Created**: 2018-05-24
- **Last Updated**: 2020-12-19
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# design_pattern_via_java
> 兴趣驱动学习,让学习成为一种习惯!
>
> 达内直播课 TEDU LIVE VIDEO
>
> 订阅号: TLV_CN
>
> 服务号: TEDU_TMOOC
---
- [1. 简介 Introduce](#1-简介-introduce)
- [1.1. 前置课程](#11-前置课程)
- [1.1.1. 统一建模语言 UML](#111-统一建模语言-uml)
- [1.1.1.1. 关联关系](#1111-关联关系)
- [1.1.1.1.1. 关联强度](#11111-关联强度)
- [1.1.2. 面向对象 OOP](#112-面向对象-oop)
- [1.1.2.1. 面向对象基本概念](#1121-面向对象基本概念)
- [1.1.2.2. 面向对象的四要素](#1122-面向对象的四要素)
- [1.1.2.2.1. 抽象 Abstract](#11221-抽象-abstract)
- [1.1.2.2.2. 封装:Encapsulation](#11222-封装encapsulation)
- [1.1.2.2.3. 继承:Inheritance](#11223-继承inheritance)
- [1.1.2.2.4. 多态:Polymorphism](#11224-多态polymorphism)
- [1.1.3. 面向对象基础](#113-面向对象基础)
- [1.1.3.1. 类和对象实例](#1131-类和对象实例)
- [1.1.3.2. 构造](#1132-构造)
- [1.1.3.3. 方法重载](#1133-方法重载)
- [1.1.3.4. 抽象类 abstract](#1134-抽象类-abstract)
- [1.1.3.5. 接口 inerface](#1135-接口-inerface)
- [1.1.3.6. 集合](#1136-集合)
- [1.1.3.7. 泛型](#1137-泛型)
- [1.2. 设计模式的概念](#12-设计模式的概念)
- [2. 目录 Table of Content](#2-目录-table-of-content)
- [2.1. 设计原则 Design Principle](#21-设计原则-design-principle)
- [2.1.1. 设计原则和设计模式的关系](#211-设计原则和设计模式的关系)
- [2.1.2. 指导原则 Concept Principle](#212-指导原则-concept-principle)
- [2.1.2.1. KISS](#2121-kiss)
- [2.1.2.2. CHANGE](#2122-change)
- [2.1.2.3. DRY](#2123-dry)
- [2.1.3. 编码原则 Coding Principle](#213-编码原则-coding-principle)
- [2.1.3.1. SOLID](#2131-solid)
- [2.1.3.1.1. 单一职责原则 SRP](#21311-单一职责原则-srp)
- [2.1.3.1.2. 开放封闭原则 OCP](#21312-开放封闭原则-ocp)
- [2.1.3.1.3. 里式替换原则 LSP](#21313-里式替换原则-lsp)
- [2.1.3.1.4. 接口隔离原则 ISP](#21314-接口隔离原则-isp)
- [2.1.3.1.5. 依赖倒置原则 DIP](#21315-依赖倒置原则-dip)
- [2.1.3.2. 通用原则 Common Principle](#2132-通用原则-common-principle)
- [2.1.3.3. 迪米特法则(LOD)](#2133-迪米特法则lod)
- [2.1.3.4. 合成聚合复用原则(CARP)](#2134-合成聚合复用原则carp)
- [2.1.3.5. 约定优于配置(CoC)](#2135-约定优于配置coc)
- [2.1.3.6. 共同封闭原则(CCP)](#2136-共同封闭原则ccp)
- [2.1.3.7. YAGNI原则](#2137-yagni原则)
- [2.1.3.8. 命令查询分离原则(CQS)](#2138-命令查询分离原则cqs)
- [2.1.3.9. 好莱坞原则(Hollywood Principle)](#2139-好莱坞原则hollywood-principle)
- [2.1.3.10. 控制反转原则(IoC)](#21310-控制反转原则ioc)
- [2.1.3.11. 关注点分离原则(SoC)](#21311-关注点分离原则soc)
- [2.1.3.12. 无环依赖原则(ADP)](#21312-无环依赖原则adp)
- [2.2. 创建型设计模式 Creational Pattern](#22-创建型设计模式-creational-pattern)
- [2.2.1. 简单工厂 Simple Factory](#221-简单工厂-simple-factory)
- [2.2.2. 工厂方法 Factory Method](#222-工厂方法-factory-method)
- [2.2.3. 抽象工厂 Abstract Factory](#223-抽象工厂-abstract-factory)
- [2.2.4. 单例 Singleton](#224-单例-singleton)
- [2.2.5. 建造者 Builder](#225-建造者-builder)
- [2.2.6. 原型 Prototype](#226-原型-prototype)
- [2.3. 结构型设计模式 Structural](#23-结构型设计模式-structural)
- [2.3.1. 适配器 Adapter](#231-适配器-adapter)
- [2.3.2. 桥接 Bridge](#232-桥接-bridge)
- [2.3.3. 组合 Composite](#233-组合-composite)
- [2.3.4. 装饰 Decorator](#234-装饰-decorator)
- [2.3.5. 外观 Facade](#235-外观-facade)
- [2.3.6. 享元 Flyweight](#236-享元-flyweight)
- [2.3.7. 代理 Proxy](#237-代理-proxy)
- [2.4. 行为型设计模式 Behavioral](#24-行为型设计模式-behavioral)
- [2.4.1. 职责链 Chain of Responsibility](#241-职责链-chain-of-responsibility)
- [2.4.2. 命令 Command](#242-命令-command)
- [2.4.3. 观察者 Observer](#243-观察者-observer)
- [2.4.4. 终结者 Mediator](#244-终结者-mediator)
- [2.4.5. 备忘录 Memento](#245-备忘录-memento)
- [2.4.6. 解释器 Interpreter](#246-解释器-interpreter)
- [2.4.7. 迭代器 Iterator](#247-迭代器-iterator)
- [2.4.8. 状态 State](#248-状态-state)
- [2.4.9. 策略 Strategy](#249-策略-strategy)
- [2.4.10. 模板方法 Template Method](#2410-模板方法-template-method)
- [2.4.11. 访问者 Visitor](#2411-访问者-visitor)
- [3. 关于达内直播课 About TEDU Live Video](#3-关于达内直播课-about-tedu-live-video)
- [4. 贡献者](#4-贡献者)
---
## 1. 简介 Introduce
### 1.1. 前置课程
#### 1.1.1. 统一建模语言 UML
Unified Modeling Language
##### 1.1.1.1. 关联关系
- 泛化:Generalization
- 实现:Realization
- 依赖:Dependency
- 关联:Association
- 聚合:Aggregation
- 组合:Composition
###### 1.1.1.1.1. 关联强度
```markdown
泛化 = 实现 > 组合 > 聚合 > 关联 > 依赖
```
#### 1.1.2. 面向对象 OOP
##### 1.1.2.1. 面向对象基本概念
- 面向对象分析(OOA):Object Oriented Analysis
- 面向对象设计( OOD):Object-Oriented Design
- 面向对象编码(OOP):Object-Oriented Programming
##### 1.1.2.2. 面向对象的四要素
###### 1.1.2.2.1. 抽象 Abstract
###### 1.1.2.2.2. 封装:Encapsulation
每个对象都包含进行操作所需要的所有信息,不必依赖其它对象
好处
- 减少耦合
- 类内部的实现可以自由修改
- 类有清晰的对外接口
###### 1.1.2.2.3. 继承:Inheritance
代表了 is-a 的关系
好处
- 拥有父类所有非私有的属性和功能
- 子类可以重写父类功能
- 子类可以扩展属性和功能
坏处
- 跟随父类变化
- 破坏封装,父类实现细节暴露给子类
- 强耦合关系
###### 1.1.2.2.4. 多态:Polymorphism
不同的对象可以执行相同的动作,但是通过自己的实现代码执行
注意要点
- 子类以父类身份出现
- 子类在工作时以自己的方式实现
- 子类以父类身份出现时,子类特有属性和方法不可用
#### 1.1.3. 面向对象基础
##### 1.1.3.1. 类和对象实例
对象是一个自包含的实体,可以用一组可识别的特性和行为标识。
类就是具有相同属性和功能的对象的抽象的集合。
- class
- 属性
- 方法
- 修饰符
- public
- protected
- private
##### 1.1.3.2. 构造
对类进行初始化
- 与类名相同,没有返回值
- 如果没有自定义构造,系统会分配默认空构造
##### 1.1.3.3. 方法重载
方法名称相同,参数列表不同
- 参数个数
- 参数类型
- 参数顺序
##### 1.1.3.4. 抽象类 abstract
特点
不允许实例化
必须被非抽象子类实现其抽象方法
抽象方法必须在抽象类中
##### 1.1.3.5. 接口 inerface
接口把隐式公共方法和属性组合起来,是封装了特定功能的一个集合。
实现接口的类必须支持接口所有属性和方法。
类可以实现多个接口。
##### 1.1.3.6. 集合
##### 1.1.3.7. 泛型
具有类型占位符
### 1.2. 设计模式的概念
设计模式是在 **特定环境** 下解决 **特定问题** 的 **处理办法**。
是前人经验的总结,是发现的过程而不是发明创造的结果。
设计模式代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用的。
设计模式是一套被反复使用的、多人知晓的、经过分类编目的、代码设计经验的总结。
设计模式使代码编写真正工程化,也是代码重构的解决方案之一。
但是某些情况下,设计模式是用于弥补语言的不足,有些语言中,某些设计模式不再适用。
## 2. 目录 Table of Content
### 2.1. 设计原则 Design Principle
设计原则是软件设计的核心思想和目标,主要考虑以下方面
- 可靠性
- 灵活性
- 健壮性
- 维护性
- 阅读性
- 测试性
- 先进性
- 扩展性
#### 2.1.1. 设计原则和设计模式的关系
设计原则体现设计模式的思想。
设计模式实现设计原则的目标。
设计原则和设计模式之间有可能会冲突,需要选择合适的平衡点。
#### 2.1.2. 指导原则 Concept Principle
##### 2.1.2.1. KISS
Keep It Simple,Stupid
化繁为简、返璞归真、保持精炼
##### 2.1.2.2. CHANGE
找到变化、封装变化
保持代码弹性、应对需求变化
- 任何需求的变更都是需要成本的
- 通过构建抽象来隔离变化
##### 2.1.2.3. DRY
Don't Repeat Yourself
消除代码的冗余,有时与可读性会有矛盾
#### 2.1.3. 编码原则 Coding Principle
##### 2.1.3.1. SOLID
###### 2.1.3.1.1. 单一职责原则 SRP
Simple Responsibility Principle
类职责尽量单一。
能够提供的服务越少,修改的可能性就会越少,维护成本就会越低。
就一个类而言,应该仅有一个引起它变化的原因。
高内聚、低耦合。
###### 2.1.3.1.2. 开放封闭原则 OCP
Open Close Principle
对外扩展开放,对内修改封闭,高内聚、低耦合。
###### 2.1.3.1.3. 里式替换原则 LSP
Liskov Substitution Principle
所有父类引用的位置一定能够被替换成子类对象,伴生多态,提高灵活性。
###### 2.1.3.1.4. 接口隔离原则 ISP
Interface Segregation Principle
针对接口编程,而不是针对实现编程。
接口内的方法应尽量形成最小算法簇,通过多接口实现扩展和降耦。
###### 2.1.3.1.5. 依赖倒置原则 DIP
Dependence Inversion Principle
高端类不应依赖低端子类,抽象不应该依赖细节;细节应该依赖抽象。
##### 2.1.3.2. 通用原则 Common Principle
##### 2.1.3.3. 迪米特法则(LOD)
Law Of DemeterSimple
两个类如果不必彼此通信,那么这两个类就不应当发生直接的相互作用。
如果一个类需要调用另一个类的某个方法,可以通过第三者转发这个调用。
在类的结构设计上,每一个类都应当尽量降低成员的访问权限。
##### 2.1.3.4. 合成聚合复用原则(CARP)
Composite/Aggregate Reuse Principle
尽量通过组合(聚合)的关联方式,而不要使用继承。
继承的缺点
- 类爆炸
- 破坏封装
- 速度缓慢
##### 2.1.3.5. 约定优于配置(CoC)
Convention over Configuration
减少需要作出决定的数量,仅需规定应用中不符约定的部分。
将公认的配置方式和信息作为内部缺省方式的规则来使用。
##### 2.1.3.6. 共同封闭原则(CCP)
Common Closure Principle
所有的修改都发生在一个包里。
包中的所有类对于同一种性质的变化应该是共同封闭的。
##### 2.1.3.7. YAGNI原则
You Ain’t Gonna Need It
避免过度设计,不必要的复杂性都会让系统变得难于调整。
后期通过重构修正,开发也是沟通博弈的构成。
##### 2.1.3.8. 命令查询分离原则(CQS)
Command-Query Separation
接口设计尽量剥离查询和命令职责。
因为命令有可能修改对象状态,而查询则不会。
##### 2.1.3.9. 好莱坞原则(Hollywood Principle)
Don’t call us, We’ll call you
组件尽量保持被动状态,初始化和调用通过容器负责,也是IoC的基础原则。
##### 2.1.3.10. 控制反转原则(IoC)
Inversion of Control
- 依赖注入(DI):Dependency Injection
- 依赖查找(DL):Dependency Lookup
##### 2.1.3.11. 关注点分离原则(SoC)
Separation of Concerns
将问题能分解为独立且较小的问题,相对较易解决,标准化或抽象。
##### 2.1.3.12. 无环依赖原则(ADP)
Acyclic Dependencies Principle
包之间的依赖结构必须是一个直接的无环图形。
也就是说,在依赖结构中不允许出现环。
### 2.2. 创建型设计模式 Creational Pattern
主要解决对象实例化过程中遇到的问题。
#### 2.2.1. 简单工厂 Simple Factory
解决具备相同父类外观的子类产品实例化问题。
[具体信息](02_创建型设计模式/01_简单工厂/readme.md)
#### 2.2.2. 工厂方法 Factory Method
#### 2.2.3. 抽象工厂 Abstract Factory
#### 2.2.4. 单例 Singleton
#### 2.2.5. 建造者 Builder
#### 2.2.6. 原型 Prototype
### 2.3. 结构型设计模式 Structural
#### 2.3.1. 适配器 Adapter
#### 2.3.2. 桥接 Bridge
#### 2.3.3. 组合 Composite
#### 2.3.4. 装饰 Decorator
#### 2.3.5. 外观 Facade
#### 2.3.6. 享元 Flyweight
#### 2.3.7. 代理 Proxy
### 2.4. 行为型设计模式 Behavioral
#### 2.4.1. 职责链 Chain of Responsibility
#### 2.4.2. 命令 Command
#### 2.4.3. 观察者 Observer
#### 2.4.4. 终结者 Mediator
#### 2.4.5. 备忘录 Memento
#### 2.4.6. 解释器 Interpreter
#### 2.4.7. 迭代器 Iterator
#### 2.4.8. 状态 State
#### 2.4.9. 策略 Strategy
#### 2.4.10. 模板方法 Template Method
#### 2.4.11. 访问者 Visitor
## 3. 关于达内直播课 About TEDU Live Video
## 4. 贡献者