设计模式应该遵循的原则
- 依赖倒置原则
- 高层模块不应该依赖于底层模块,二者都应该依赖于抽象
- 抽象不应该依赖于实现细节,实现细节依赖于抽象
- 开放封闭原则
- 对扩展开放,对更改封闭
- 类模块应该是可扩展的,但是不可修改的
- 单一职责原则
- 一个类应该仅有一个引起他变化的原因
- 变化的方向隐含类的指责
- Liskov替换原则
- 子类必须能够替换他们的基类(IS-A)
- 继承表达类型抽象
- 接口隔离原则
- 不应该强迫客户程序依赖他们不用的方法
- 接口应该小而完备
- 优先使用对象组合,而不是类继承
- 类继承通常为"白箱复用",对象组合通常为"黑箱复用"
- 继承在某种程度上破坏了封装性,子类父类耦合度高
- 对象组合只要求被组合的对象具有良好定义的接口,耦合度高
- 封装变化点
- 一侧变化一侧稳定
- 针对接口设计,不针对具体实现设计
- 静态->动态
- 早绑定->晚绑定
- 继承->组合
- 编译时依赖->运行时依赖
- 紧耦合->松耦合
模板方法模式
动机
在一个稳定的整体操作结构中,各个子步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
定义
在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变算法结构的情况下,重新定义算法中的某些步骤。
代码实现
public abstract class CaffeineBeverage{
void final prepareRecipe() {
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew(); // 由子类决定以下两个方法的具体实现,父类只规定代码执行的流程。
abstract void addCondiments();
void biolWater() {
//由父类实现该方法
}
void pourInCup() {
//由父类实现该方法
}
}
在父类中还可以有一种方法,通过该方法作为判定条件,来改变模板方法模板的执行流程。子类可以重写该方法,进而该百年父类中规定的模板流程。
具体代码如下:
public abstract class CaffeineBeverageWithhook{
void final prepareRecipe() {
boilWater();
brew();
pourInCup();
if (customerWantsCondiments()){//通过方法的返回值来决定该步骤是否执行
addCondiments();
}
}
abstract void brew(); // 由子类决定以下两个方法的具体实现,父类只规定代码执行的流程。
abstract void addCondiments();
void biolWater() {
//由父类实现该方法
}
void pourInCup() {
//由父类实现该方法
}
boolean customerWantsCondiments() {
return true;
}//该方法允许被子类重写,从而改变返回值,进而更改prepareRecipe() 方法的执行流程。
}
模板方法在框架设计方面有着非常重要的地位。