简洁,个人看;
适应设计模式
1、Iterator迭代器模式
- iterator 两个方法: hasNext、next;
- 实现这个接口。
- 使用 iterator
2、Adapter适配器模式
- 对现有的组件重复利用, (放在统一接口里 调用);
- 对现有的类进行适配,生成新的类
- 已有的 组件、类 都是经历 时间沉淀的,几乎没有问题的
- 版本升级和 兼容
注意:功能完全不同的类,Adapter模式无法使用;
两种方式: 类适配(继承)、对象适配(委托)
- print 提供 统一的 适配接口
- PrintBanner 进行适配的 组装
交给子类
3、Template Method模式
(很多地方 都用到这 这个思想)
在父类中定义处理流程的框架,在子类中实现具体处理的模式。
4、Factory Method 工厂方法模式
父类决定实例的生成方式,但并不决定索要生成的具体的类,具体的处理全部交给子类负责。
将生成实例的框架 和 实际负责生成实例的类 解耦
- create定义 实例生成方式, 调用了 createProduct 和 registerProduct
- 实例Factory 继承自 Factory, 实现 createProduct 和 registerProduct方法;
生成实例
5、Singleton模式
Tips: 两点
- 构造函数 private
- getInstance, 对外提供接口 获取 唯一实例
public class Singleton {
private static Singleton singleton = new Singleton();
private Singleton(){
System.out.println("生成了一个实例");
}
public static Singleton getInstance(){
return singleton;
}
}
6、Prototype(原型) 模式
利用 clone方法, 复制 存放已存在的 类; 一般用 map 存放
Manager 类
import java.util.HashMap;
public class Manager {
private HashMap showcase = new HashMap();
public void register(String name, Product proto){
showcase.put(name,proto);
}
//
public Product create(String protoname){
Product p = (Product)showcase.get(protoname);
return p.crateClone();
}
}
7、Builder 建造者模式
用于组装具有复杂结构的实例
- 定义 Builder接口
- 可以多个 实现 Builder接口
- Director委托, 使用 Builder
8、Abstract Factory 抽象工厂模式
抽象工厂的工作是将“抽象零件” 组装成为“抽象产品”
我们并不关心零件的具体实现,而是只关心接口(API)。我们仅使用该接口(API)将零件组装成为产品。
- 先 抽象 工厂
- 可以实例化 多种 工厂
- 零件 不好更改; 实例工厂好增加
9、Bridge桥接模式
希望新增功能:
- 类的功能层次结构: 继承
- 类的实现层次结构: 实现接口
把功能分开 更容易 扩展
10、Strategy策略模式
将 算法和 其他部分 分离开来;
程序运行中可以切换 策略;
易于 扩展 策略方法;
一致性
11、Composite 组合模式
能够使容器与内容有一致性,创造出递归结构的模式。
比如: 目录和文件
- 内容 和 容器 都实现 同样的接口, 所以可以通过 里氏代换 对 接口进行操作;
- 要注意 接口Entry 要和 容器的 api 尽量一致;
12、Decorator (装饰者)模式(有点模糊)
有点像 Composite模式
在不改变被装饰物的前提下增加功能:使用委托
注意: 父类 和 子类 的一致性处理
访问数据结构
13、Visitor(访问者)模式
- Visitor模式中,数据结构与处理被分离开来。
- 我们编写“访问者”的类来访问数据结构中的元素,并把对各元素的处理交给访问者类。
- 这样,当需要增加新的处理时,我们只需要修改或编写新的访问者,然后让数据结构可以接受访问者的访问即可。
- 观察者: 抽象一个 , 实例多个; 主要是 visit(element) 访问数据结构
- element: 含有 accept 函数, 接收 visitor 来访问;
易于增加ConcreteVisitor角色
难以增加ConcreteElement角色
14、Chain Of Responsibility 责任链模式
类似于 链表: 当前节点解决不了, 移到下一个节点解决问题;
弱化了发出请求地人和处理请求的人之间的关系
可以动态地改变职责链
专注于自己的工作
推卸请求会导致处理延迟吗
确实如此。
15、Facade 外观模式
可以为互相关联在一起地错综复杂地类整理出高层接口(API),让系统对外只有一个简单的接口(API),并且考虑系统内部各个类之间地责任关系和依赖关系,按照正确地顺序调用各个类。
Facade 向外提供接口
向内:组织(调用)内部 类之间的关系,实现某功能;
16、Mediator 仲裁者模式
不让各个对象之间互相通信,而是增加一个仲裁者角色,让他们各自和仲裁者通信,然后将控制显示的逻辑处理交给仲裁者负责。
仲裁者成为 Mediator,各组员被称为Colleague。
管理状态
17、Observer 观察者模式
-
observer: 实现update(targetElement)方法
-
被监听的:添加observer的管理: 增删改查、和 notifyObservers():调用 update方法;
-
一方面,subject角色 不知道谁在监听自己,但实现了 update接口,就可以调用update接口
-
另一方面,observer可以 通过统一的接口,调用getNumber()方法;
18、Memento备忘录模式
memento相当于 快照一样,保存当前状态的所有属性 的值;
简单的api 就是 保存 和 加载;
还可以扩展 对 mementos 的 管理;比如 过期时间等;
19、state 状态模式
用类来表示状态,我们可以通过切换类来方便的改变对象的状态;当需要增加新的状态时,如何修改代码这个问题也会很明确。
20、flyweight 享元模式
共享对象,避免浪费(轻量级,所使用的内存的大小)
当需要某个实例时,并不总是通过new关键字来生成实例,而是尽量共用已经存在的实例。
和单例结合;
21、Proxy代理模式
只在必要时生成实例
当代理人遇到无法自己解决色事情就会去找本人解决该问题。
- 代理可以 含有 部分功能; 当 代理完成不了的时候, 请求 本人 来完成繁杂工作;
- proxy和realsubject 之间要有一致性接口;
- 大型系统 初始化非常漫长; 可以用 代理处理一些 简单工作;