一、策略模式
策略模式定义了算法族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
多用组合,少用继承
针对接口编程,不针对实现编程
接口绑定实现类
二、观察者模式
观察者模式定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
出版社 + 订阅者 = 观察者模式
为了交互对象之间的松耦合设计而努力
松耦合的设计之所以能让我们建立有弹性的OO系统,能够应对变化,是因为对象之间的互相依赖降到了最低。
三、装饰者模式
装饰者模式动态地将责任附加到对象上。若要拓展功能,装饰者提供了比继承更有弹性的替代方案。
装饰者可以在所委托被装饰者的行为之前与(或)之后,加上自己的行为,以达到特定的目的。
类应该对拓展开放,对修改关闭。
四、工厂模式
工厂方法用来 处理对象的创建,并将这样的行为封装在子类中。这样,客户程序中关于超类的代码就和子类对象创建代码解耦了。
所有工厂模式都用来封装对象的创建。工厂方法模式通过让子类决定该创建的对象是什么,来达到将对象创建的过程封装的目的。
工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
依赖倒置原则 要依赖抽象,不要依赖具体类
避免违反倒置原则:
- 变量不可以持有具体类
- 不要让类派生自具体类
- 不要覆盖基类中已实现的方法
抽象工厂模式提供一个接口,用于创建相关或依赖对象的家族,则不需要明确指定具体类。
五、单例(件)模式
单件模式确保一个类只有一个实例,并提供一个全局访问点。
多线程问题解决办法:
- synchronized, 将getInstance()变成同步方法,每个线程在进入这个方法之前,要等候别的线程离开。
缺点很明显,我们只在第一次执行此方法才需要同步,以后都是累赘 - 直接在静态初始化器来创建单件。没有了延迟实例化的优点
- 用双重检查加锁,在getInstance()中减少使用同步
public class Singleton{
private volatile static Singleton uniqueInstance;
private Singleton() {}
public static Singleton getInstance(){
if(uniqueInstance == null){
synchronzied (SingleTon.class){
if(uniqueInstance == null){
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}
六、命令模式
命令模式将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
七、适配器模式与外观模式
适配器模式将一个类的接口,装换成客户期望的另一个接口。适配器让原本接口不兼容的类可以合作无间。
有两种适配器:对象适配器和类适配器。
对象适配器利用组合的方式将请求传送给被适配者;类适配器利用多继承。
外观模式提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。
八、模板方法模式
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
- 钩子是一种方法,它在抽象类中不做事,或者只做默认的事情,子类可以选择要不要去覆盖它。
- 好莱坞原则(别调用我们,我们会调用你)告诉我们,将决策权放在高层模板中。
- 策略模式和模板方法模式都封装算法,一个用组合,一个用继承。
- 工厂方法时模板方法的一种特殊版本。
九、迭代器模式和组合模式
迭代器模式提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。
尽量让每个类保持单一责任。
组合模式允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
十、状态模式
状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。
和程序状态机不同,状态模式用类代表状态
十一、代理模式
远程方法101
客户对象、客户辅助对象、服务辅助对象、服务对象
RMI提供了客户辅助对象和服务辅助对象,为客户辅助对象创建和服务对象相同的方法。
代理模式为另一个对象提供一个替身或占位符以控制对这个对象的访问
-
远程代理控制访问远程对象
-
虚拟代理控制访问创建开销大的资源
-
保护代理基于权限控制对资源的访问
-
防火墙代理控制网络资源的访问,保护主题免于“坏客户”的侵害
-
智能引用代理 当主题被引用时,进行额外的引用动作,例如计算一个对象被引用的次数
-
缓存代理 为开销大的运算结果提供暂时储存:它也允许多个客户共享结果,以减少计算或网络延迟
-
同步代理在多线程的情况下为主题提供安全的访问
-
复杂隐藏代理 用来隐藏一个类的复杂集合的复杂度,并进行访问控制。有时候也称为外观代理,这不难理解。复杂隐藏代理和外观模式是不一样的,因为代理控制访问,而外观模式只提供另一组接口。
-
写入时复制代理用来控制对象的复制,方法是延迟对象的复制,直到客户真的需要为止。这是虚拟代理的变体。
十二、复合模式
MVC是复合模式,结合了观察者模式、策略模式和组合模式。
- 模型使用观察者模式,以便观察者更新,同时保持两者之间的解耦
- 控制器是视图的策略,视图可以使用不同的控制器实现,得到不同的行为
- 视图使用组合模式实现用户界面,用户界面通常组合了嵌套的组件,想面板,框架和按钮。
十三、其他的设计模式
- 桥接
- 生成器
- 责任器
- 蝇量
- 解释器
- 中介者
- 备忘录
- 原型
- 访问者