设计模式的三原则:
1. 面向接口编程,而非实现;
2. 多用组合,少用继承;
3. 高内聚、低耦合;
看另一篇博客
https://blog.csdn.net/hefrankeleyn/article/details/99703244
关键是创建clone方式,有时候该方法很复杂。
AbstractFactory通常会用工厂方法(Factory Method)现实,也可以用Prototype现实。一个具体的工厂通常是一个单件。
封装对象的创建过程。
下面是生成器模式的时序图:
组合类和对象以获得更大的结构
适配器模式: 将类接口转变为客户希望的另一个接口。
适配器模式有两种实现方式: 对象适配、类适配(在Java中无法实现,因为需要多继承)。
两种方式的类图如下:
将抽象部分和实现部分相分离,使它们可以独立变化。
抽象类与抽象类之间的关系称之为桥接。
桥接模式时序图:
组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。
装饰模式: 动态地给一个对象添加一些额外的职责。
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观模式定义了一个高层接口,这个接口使得子系统更加容易使用。
如果让某个类的一个实例能用来提供许多“虚拟实例”, 就使用亨元模式。主要用于减少创建对象的数量,以减少内存占用和提供性能。
一种场景:创建一个对象,通过修改对象的属性,重复利用。
代理模式: 为其他对象提供一种代理以控制对这个对象的访问。
Java动态代理
使多个对象都有机会处理某一个请求。职责链模式将请求的发送者和接受者解耦。
下面是一个实例:
https://refactoring.guru/design-patterns/chain-of-responsibility/java/example#example-0--middleware-Middleware-java
将请求封装成一个对象,从而可以使用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤销的操作。
client 相当于main方法,Invoker 相当于遥控器,对遥控器上的按钮设置Command。main方法中初始化接收者和具体命令的对象。
时序图如下:
为语言创建解释器。
如果一种特定类型的问题发生的频率足够高,那么就值得将该问题的各个实例表述为一个简单语言中的句子。这样就可以构建一个解释器,该解释器通过解释这些句子来解决该问题。
提供一种方法顺序访问一个聚合对象的各个元素,而不暴露其内部的表示。
文章:包(Bag)、队列(Queue)、堆栈(Stack)的实现
下面是中介者模式的类图
参考了一篇博客: https://blog.csdn.net/zhengzhb/article/details/7430098
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将对象恢复到原先保存的状态。
参考博文:https://www.cnblogs.com/java-my-life/archive/2012/06/06/2534942.html
定义对象间的一种一对多的依赖关系,当一个对象的状态发生变化时,所有依赖于它的对象都得到通知并被自动更新。
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
如果使用数据值定义内部状态并且让Context操作来显式地检查这些数据。但这样将使整个Context的实现中遍布看起来相似的条件语句或case语句。增加一个新的状态可能需要改变若干个操作,这就使得维护变得复杂了。
定义一系列的算法,把它们一个个封装起来,并且使它们可以相互替换。
定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。TemplateMethod使得子类可以不改变一个算法的结结构即可重定义该算法的某些特定步骤。
表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
参考博客:https://www.cnblogs.com/java-my-life/archive/2012/06/14/2545381.html