# 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. 贡献者