一) 策略模式
很好地解决了继承和接口各自的不足。
1) 继承:因为所有的子类都继承了父类的方法,所以对于部分子类共有的方法,而另一部分子类没有的方法。只能用子类覆盖的方式来解决(要么父类不提供抽象方法,在需要的子类中新增此方法)。
2) 接口:比1) 中红色字的方法更好的方式是使用接口,这样子类更统一,强制子类必须实现某些接口方法。但是这样仍然使得各个子类都必须去实现多个接口。
3) 策略模式:
要点1:父类中包含“行为组合”变量(声明接口的变量,此父接口变量可指向一组行为中的任何一个)。
要点2:行为组合——统一的行为接口,每个行为必须继承此接口。
4)体现的编程原则:
1.针对接口编程,不要针对实现编程
2.“有一个"(has a)比"是一个"(is a)更好。
二) 观察者模式
1)记忆方法
a)
主题:必须有三个方法registerObserver(Observer o),removeObserver(Observer o),notifyObservers(Observer o)。(java。util.Observable: addObserver(),deleteObserver(),notifyObservers()).
观察者:必须有update()方法(或其他需要的方法,用接口表示。)
以上两部分都用接口表示出来,让主题和观察者实现这些接口。确保主题和观察者内有这些方法。
b)你中有我,我中有你
主题:notifyObserver时,调用Observer的update方法。
观察者:构造函数内,调用主题的registerObserver(Observer o)方法。
三) 装饰者模式
1)记忆方法
a)装饰者中有两个对象:装饰者和被装饰者。
b)装饰者必须继承自被装饰者。
2)调用过程图解有点像递归。
四) 工厂模式
1)简单工厂:只是简单的将程序中new的部分(带if else 的参数判断)抽象出来。
2)工厂方法和抽象工厂方法:工厂方法和抽象工厂方法都有简单工厂的影子,不同的是:工厂方法使用继承,让子类决定要实例化的类是哪一个;而抽象工厂方法使用对象组合(接口或抽象类都可以)。抽象工厂可以理解为多条平行的工厂方法的集合。
结束语:在设计中,但凡有new的地方(创建对象的地方)就可以引入“工厂”。
五) 单件模式
1)
要点1:要有一个静态变量;
要点2:获取静态变量时,判断是否已经生成;已经生成过,就读取,没有生成过就新建一个。
2)双重检查加锁(volatile)
第一次检查:为了让程序只有在静态变量uniqueInstance未被创建时才执行“同步”。
第二次检查:是同步块内原本就需要的。没有它可能会创建多个静态变量uniqueInstance。
备注:不同现场仍然有可能会分别运行第一次的检查,即不同线程执行第一次检查的总次数多于一次。