Java # Design Patrern 设计模式
Observer Pattern
观察者模式
简单点理解就是为了更新内容,,定义了对象之间的一对多依赖,多个对象同时监听一个对象,当被监听对象的状态发生改变时,它的所有依赖者都会收到通知并自动更新,被监听对象称为主题suject,监听对象称为观察者observer。
- 父类为抽象类,父类中的update()方法为抽象方法。
- observer必须实现update方法,来接收suject状态变化时的通知及更新。suject维护一个observer列表,在状态变化时会逐个的调用observer的update方法来通知、更新observer,为此,suject须提供注册(添加observer到列表)、删除、通知更新三个方法。
Pull Observer
再举一个例子:
push Observer
Pull Observer/ Push Observer 的区别:
- push是指suject在状态变化时将所有的状态信息都发给observer,pull则是suject通知observer更新时,observer获取自己感兴趣的状态
- Pull需要Observer自己去取数据,所以Subject要提供相应的get方法
- push模式要求suject必须了解observer需要的状态,pull则是observer按需获取;push模式下observer的update方法的参数是具体的状态信息,发生变化时必须要重写update方法,pull模式则是将suject对象本身传给update,是最大的参数集合
Composite Pattern
组合模式
需要注意的是该模式下:
- 父类必须是一个抽象类且包含一个抽象类(可以注意到下图中的父类和父类中的抽象方法是斜体,斜体代表抽象)
- 有两个子类去继承父类,且实现父类中的抽象方法
- 有一个Aggregation(聚合)
有两种设计变体用于定义和实现子相关操作,例如向容器添加子组件或从容器中删除子组件(add(child)/remove(child)) 以及访问子组件 ( getChild()):
- 设计的一致性:与子项相关的操作在接口中定义Component。这使得客户能够统一对待Leaf和Composite对象。但是类型安全性会丢失,因为客户端可以对对象执行与子级相关的操作Leaf。
- 类型安全设计:与子级相关的操作仅在类中定义Composite。客户必须以不同的方式对待Leaf和Composite反对。但由于客户端无法Leaf对对象执行与子级相关的操作,因此获得了类型安全。
组合设计模式强调一致性而非类型安全。
以下是一个例子:
TemplateMethod Pattern
注意抽象类和抽象方法
TemplateMethod()是具体的算法骨架
Strategy Pattern(Template Class)
策略模式
注意区分和前面的TemplateMethod Pattern
策略模式(也称为策略模式)是一种行为 软件设计模式,允许在运行时选择算法。代码不是直接实现单个算法,而是接收运行时指令,决定使用哪一组算法。Strategy 模式是具有相同结构但更具体意图的模板类模式。
和TemplateMethod 类似,但是Hook对象和它们的hook方法可以在运行时改变
TemplateMixin 中是组合关系,比聚合关系更强,实心菱形头。
Iterator Pattern(Input Stream)
迭代器模式(输入流)
迭代器模式是一种设计模式,其中迭代器用于遍历容器并访问容器的元素。迭代器模式将算法与容器分离;在某些情况下,算法必然是特定于容器的,因此无法分离。
Sink Pattern(Output Stream)
Factory Class Pattern
工厂模式
可以通过Dependency(依赖)关系和Association(关联)关系来判断各个部分;注意抽象类和抽象方法
Decorator Pattern
装潢模式
它能解决什么问题?
- 在运行时动态地向对象添加(或从对象中删除)
- 提供一种灵活的子类化替代方案来扩展功能
需要注意:
- 注意子类聚合关系数量仅仅为1且只有一个composite;
- 将继承与聚合相结合;
Singleton Pattern
单例模式
Adapter Pattern
适配器模式
该模式用于将一个界面转换为另一种界面。这使得具有相互不兼容接口的类能够进行通信。
下图为对象适配器
下图也叫类适配器,类适配器的优点是它完全适应目标类,因此只能覆盖目标类的行为;缺点是类适配器不能用于自动适配子类
State Pattern
状态模式
允许对象在其内部状态发生变化时改变其行为,状态模式可以解释为策略模式,它能够通过调用模式接口中定义的方法来切换策略
状态模式主要解决两个问题:
- 当对象的内部状态改变时,它的行为应该改变。
- 特定于状态的行为应该单独定义。也就是说,添加新状态不应该影响现有状态的行为。
欢迎阅读,以及欢迎指出不足之处,如果点赞就更好了;
祝您学习愉快~😊😊😊