设计模式的三原则:
1. 面向接口编程,而非实现;
2. 多用组合,少用继承;
3. 高内聚、低耦合;
第一部分: 创建型模式
1.1、单件模式(Singleton)
看另一篇博客
1.2、工厂方法模式(Factory Method)

1.3、原型模式(Prototype)
关键是创建clone方式,有时候该方法很复杂。

1.4、抽象工厂模式(AbstractFactory)
AbstractFactory通常会用工厂方法(Factory Method)现实,也可以用Prototype现实。一个具体的工厂通常是一个单件。

1.5、Builder 生成器模式
封装对象的创建过程。

下面是生成器模式的时序图:

第二部分 结构型模式
组合类和对象以获得更大的结构
2.1 Adapter 适配器模式
适配器模式: 将类接口转变为客户希望的另一个接口。
适配器模式有两种实现方式: 对象适配、类适配(在Java中无法实现,因为需要多继承)。
两种方式的类图如下:

2.2 Birdge 桥接模式
将抽象部分和实现部分相分离,使它们可以独立变化。
抽象类与抽象类之间的关系称之为桥接。

桥接模式时序图:

2.3 Composite 组合模式
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

2.4 装饰者模式
装饰模式: 动态地给一个对象添加一些额外的职责。

2.5 外观模式
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。

2.6 Flyweight亨元模式
如果让某个类的一个实例能用来提供许多“虚拟实例”, 就使用亨元模式。主要用于减少创建对象的数量,以减少内存占用和提供性能。
一种场景:创建一个对象,通过修改对象的属性,重复利用。

2.7 Proxy 代理模式
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。

Java动态代理

第三部分:行为模式
3.1 Chain Of Responsibility 职责链模式
使多个对象都有机会处理某一个请求。职责链模式将请求的发送者和接受者解耦。
下面是一个实例:

3.2 Command 命令模式
将请求封装成一个对象,从而可以使用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
client 相当于main方法,Invoker 相当于遥控器,对遥控器上的按钮设置Command。main方法中初始化接收者和具体命令的对象。 
时序图如下:

3.3 Interpreter 解释器模式
为语言创建解释器。
如果一种特定类型的问题发生的频率足够高,那么就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。

3.4 Iterator 迭代器模式
提供一种方法顺序访问一个聚合对象的各个元素,而不暴露其内部的表示。

3.5 中介者模式(Mediator Pattern)
下面是中介者模式的类图
参考了一篇博客: 23种设计模式(7):中介者模式_割韭韭的博客-优快云博客

3.6 备忘录模式(Memento)
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。

3.7 观察者模式(Observer)
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。

3.8 状态模式(State)
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
如果使用数据值定义内部状态并且让Context操作来显式地检查这些数据。但这样将使整个Context的实现中遍布看起来相似的条件语句或case语句。增加一个新的状态可能需要改变若干个操作,这就使得维护变得复杂了。

3.9 策略模式(Strategy)
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。

3.10 模板方法模式(Template Method)
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结结构即可重定义该算法的某些特定步骤。

3.11 访问者模式(Visitor)
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。

本文详细总结了面向对象设计中的23种设计模式,包括创建型、结构型和行为型三大类别,涵盖了单例、工厂、适配器、组合、装饰者、外观、代理等模式,并阐述了设计模式的三大原则:面向接口编程、多用组合、高内聚低耦合。通过本文,读者可以深入理解设计模式的应用及其价值。
1094

被折叠的 条评论
为什么被折叠?



