You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
土豆兄弟 ee0e9609f7 [新增功能](master): 更新了一些设计模式的代码
1. 状态,访问者,责任链模式
2. 装饰者,适配器,享元,组合模式

-

ps : 组合模式还需要进一步学习下
3 years ago
..
src/main/java/com/baiye/design [新增功能](master): 更新了一些设计模式的代码 3 years ago
.gitignore [新增功能](master): 更新了一些设计模式的代码 3 years ago
README.md [新增功能](master): 更新了一些设计模式的代码 3 years ago
pom.xml [新增功能](master): 更新了一些设计模式的代码 3 years ago

README.md

设计模式

7大设计原则

开闭原则
依赖倒置原则
单一职责原则
接口隔离原则
迪米特原则
里氏替换原则
合成复用原则

设计模式 - 创建型模式

工厂模式,抽象工厂模式,建造者模式,单例模式,原型模式

设计模式 - 结构型模式

适配器模式,装饰者模式,代理模式,外观模式,桥接模式,组合模式,享元模式

设计模式 - 行为型模式

策略模式,观察者模式,责任链模式,备忘录模式,模板方法模式,迭代器模式,中介者模式,命令模式,访问者模式,解释器模式,状态模式

UML类图

  • 记忆技巧
    • 箭头方向 子类指向父类
    • 实线继承 | 虚线实现(空心箭头)
    • 实线关联 | 虚线依赖
    • 空心菱形-聚合 | 实心菱形-组合

UML时序图

  • 记忆技巧
    • 实心箭头-同步调用
    • 线箭头-异步调用
    • 虚线箭头-返回

UML类图讲解

软件设计七大原则


装饰者模式

1 定义与类型

定义: 在不改变原有对象的基础上,架构功能附加到对象上 提供了比继承更有弹性的替代方案(扩展原有对象功能) 类型:结构型

2 适用场景

扩展一个类的功能或者给一个类添加附加职责 动态的给一个对象添加功能,这些功能可以再动态的撤销

3 优点

继承的有力补充,比继承灵活,不改变原有对象的情况下给一个对象扩展功能 通过使用不同装饰类及这些装饰类的排列组合,可以实现不同效果 符合开闭原则

4 缺点

会出现更多的代码,更多的类,增加程序的复杂性 动态装饰时,多层装饰时会更复杂

5 相关的设计模式

装饰者模式和代理模式 - 装饰者模式: 关注在一个对象上动态的添加方法 - 代理模式: 关注控制对对象的访问 装饰者模式和适配器模式 - 装饰者模式:装饰者和被装饰者实现相同的接口或装饰者是被装饰者的子类,(也可以退化成半装饰者,装饰者还提供了其他的方法,但是不常用) - 适配器模式: 适配器和被适配的类有不同的接口,也可能有部分的接口是重合的

6 代码

com.baiye.design.structural.decorator

7 总结

以 Wapper 结尾的可能是装饰者或者适配器模式,具体看结构


适配器模式

1 定义和类型

定义: 将一个类的接口转换成客户期望的另一个接口 使原本接口不兼容的类可以一起工作 类型:结构型

2 适用场景

已经存在的类,它的方法和需求不匹配时(方法结果相同或相似) 不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品,不同厂家造成功能类似而接口不相同情况下的解决方案

3 优点

能提高类的透明性和复用性,现有的类复用但不需要改变 目标类和适配器类解耦,提高程序的扩展性 符合开闭原则

4 缺点

适配器模式编写过程需要全面考虑,可能会增加系统的复杂性 增加系统代码可读的难度

5 扩展

对象适配器 类适配器

6 相关的设计模式

适配器和外观模式 - 外观是定义新的接口,适配器是复用一个原有的接口,适配器是让两个接口协同工作,外观是在现有的系统中提供一个访问入口

7 代码

com.baiye.design.structural.adapter


享元模式

1 定义和类型

定义:提供了减少对象数量从而改善应用所需对象结构的方式 运用共享技术有效地支持大量细粒度的对象 类型: 结构型

2 使用场景

常常应用于系统底层的开发,以便解决系统的性能问题 系统有大量相似对象,需要缓冲池的场景

3 优点

减少对象的创建,降低内存中对象的数量,降低系统的内存,提高效率 减少内存之外的其他资源占用

4 缺点

关注 内部/外部状态,关注线程安全问题 使系统,程序的逻辑复杂化

5 扩展

内部状态 外部状态

6 相关的设计模式

享元模式和代理模式 享元模式和单例模式

组合模式

1 定义和类型

定义:将对象组合成树形结构以表示“部分-整体”的层次结构 组合模式使客户端对单个对象和组合对象保持一致的方式处理 类型:结构型

2 适用场景

希望客户端可以忽略组合对象与单个对象的差异时 处理一个树形结构时

3 优点

清除地定义分层次的复杂对象,表示对象的全部或部分层次 让客户端忽略了层次的差异,方便对整个层次结构进行控制 简化客户端代码 符合开闭原则

4 缺点

限制类型时会较为复杂 使设计变得更加抽象

5 组合模式的相关设计模式

组合模式和访问者模式 - 使用访问者模式可以访问组合模式中的递归结构

6 代码

com.baiye.design.structural.composite


责任链模式

1 定义与类型

为请求创建一个接收此次请求对象的链 类型: 行为型

2 使用场景

一个请求的处理需要多个对象当中的一个或多个协作处理

3 优点

请求的发送者和接收者(请求的处理)解耦 责任链可以动态组合

4 缺点

责任链太长或者处理时间过长,影响性能 责任链有可能过多

5 相关的设计模式

责任链模式和状态模式 - 责任链模式不指定下一个处理的对象 - 状态模式是知道自己处理的下一个对象是谁

6 代码

com.baiye.design.behavioral.chainofresponsibility

7 总结

责任链 -> 流程引擎 一般责任链模式的都以Chain结尾

访问者模式

1 定义与类型

封装作用于某数据结构(如List/Set/Map等)中的各元素的操作 可以在不改变各元素类的前提下,定义作用于这些元素的操作 类型:行为型

2 适用场景

当一个数据结构(List/Set/Map等)包含很多类型对象 数据结构与数据操作分离

3 优点

增加新的操作很容易,即增加一个新的访问者

4 缺点

增加新的数据结构困难 具体元素的变更比较麻烦

5 相关设计模式

访问者模式和迭代器模式 - 都是在某种数据结构上进行处理 - 访问者模式在对保存在数据结构中的元素进行某种特定处理 - 迭代器模式是逐步遍历保存在数据结构中的元素

6 coding

com.baiye.design.behavioral.visitor

7 总结

不同角色的人对数据的访问不同 一般以Visitor结尾的各种类

状态模式

1 定义与类型

允许一个对象在其内部状态改变时,改变他的行为 类型: 行为型

2 使用场景

一个对象存在多个状态(不同状态下行为不同),且状态可相互转换

3 优点

将不同的状态隔离 把各种状态的转换逻辑,分布到State的子类中,减少相互间依赖 增加新的状态非常简单

4 缺点

状态多的业务场景导致类的数目增加,系统变复杂

5 相关的设计模式

状态模式和享元模式 - 使用享元模式在多个状态上下文中共享这个模式

6 coding

com.baiye.design.behavioral.state

7 总结

多个状态 -> 状态模式解决 -> 借助 状态机 解决