一. 策略模式
- 用接口和实现的方法,代替OO的具体实现,让不同实现之间可以互相替换。
二. 观察者模式
- 主题(可理解为服务器)与观察者(可理解为客户端),只要依旧遵守两者之间的接口,那么改变两者中任意一个,都不会影响另一方(松耦合)。
- 观察者模式的一个主题对象改变状态时,它的所有依赖者都会收到通知,并自动更新。
关于java 自带 Observable:
- 有多个观察者时,不可以依赖特定的通知次序。
- Java自带 Observable 缺陷:Observable 是一个类,并不是接口,只能用继承方法创建一个派生类,而 Java 不支持多重继承,故限制了 Observable 的复用能力。
三. 装饰者模式
- 装饰者与被装饰者必须是同样的类型(即具有同样的抽象基类)。
- 装饰者与被装饰者继承于同样的抽象基类,是为了有正确的类型,而不是继承抽象基类的行为。相对而言,行为来自装饰者和基础组件,或与其他装饰者之间的组合关系。
- Java.IO 包即为装饰者模式的应用之一。
- (重要原则):对扩展开放,对修改关闭
四. 工厂模式
- 工厂方法模式:让子类决定该创建的对象是什么,达到将对象创建的过程进行封装的目的。工厂方法模式定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个(决定的意思是指:在编写创造者类时,不需要知道实际创建的产品是哪一个)。
- 工厂方法模式的优点之一:帮助我们将产品的“实现”从“使用”中解耦。
- (重要原则)依赖倒置原则:要依赖抽象,不要依赖具体类。
- 避免在 OO 设计中违反依赖倒置原则的几条原则(原则之间存在一定矛盾,并非随时都需要遵循该原则):
- 变量不可以持有具体类的引用(使用 new,就会持有具体类的引用);
- 不要让类派生自具体类(否则会依赖具体类),应该派生自一个抽象(接口或者抽象类);
- 不要覆盖基类中已经实现的方法(基类中已经实现的方法,应该由所有子类共享);
- 抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。换句话说:抽象工厂允许用户使用接口创建一组相关的产品,但不需要关注实际产出的产品具体是什么。这样,用户与产品的生产过程没有关系,即两者解耦。
- 抽象工厂的方法,经常以工厂方法的方式实现。
五. 单件模式
- 单件模式:确保一个类只有一个实例,并提供一个全局访问点。
- 将构造器声明为私有 private,类内才可以调用构造器,并定义 getInstance() 方法返回该实例对象。
- 单件模式原则上确保一个类只有一个实例,但仍有可能会出现多实例的情况。针对这种情况,可使用同步方法,令每个线程进入该方法之前,需要等候其他线程离开该方法(不会存在多个线程同时进入该方法)。但另一方面,这种做法可能会令效率较大程度的降低。
P.S:关于 volatile 与 synchronized 关键字:
- Java 中,volatile 关键字被用于多线程的并发编程中;
- 当一个共享变量被 volatile 修饰时,它会保证修改的值会立即被更新到主存;当有其他线程需要读取时,它会去内存中读取新值;
- 同时,volatile 关键字禁止进行指令重排序;
- volatile 关键字保证变量的可见性,不保证操作的原子性,一定程度上保证指令的有序性;
- 由于 volatile 无法保证操作的原子性,所以虽然 volatile 的性能由于 synchronized 关键字,但 synchronized 关键字也不能被 volatile 取代。