设计原则
好莱坞原则:别调用(打电话给)我们,我们会调用(打电话给)你
这个原则利用很形象的比喻,介绍了一种防止“依赖腐败”的方法。“依赖腐败”简单的说,就是当高层组件依赖低层组件,而同时低层组件又依赖高层组件。在这同时,还有另外的一个边侧组件依赖底层组件同时高层组件也依赖边侧组件。这样的情况,就是“依赖腐败”。这种设计十分差的设计,没有人能轻易搞懂你的系统是怎么设计的。
设计模式
这一章讲述的设计模式可以利用自己的特性来避免这种“依赖腐败”的情况发生。
模板方法模式
先来介绍模板方法模式的定义:
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法 中的某些步骤。
下面还是用具体的例子来解释模板方法模式:
下面是咖啡和茶的两个类中有两个冲泡的方法:
public void prepareCoffee(){
boilWater();
brewCoffeeGrinds();
pourInCup();
addSugarAndMilk();
}
public void prepareTea(){
boilWater();
steepTeaBag();
pourInCup();
addLemon();
}
很明显,这两个类中有很多重复的方法和代码。根据我们之前的原则,我们需要把这些重复的代码抽离出来,该怎么做呢?这里就是需要一个模板类了:
public abstract class Beverage{
public void prepareRecipe(){
boilWater();
brew();
pourInCup();
addCondiments();
}
abstract void brew();
abstract void addCondiments();
}
有了模板之后,咖啡和茶的类就可以简化如下:
public class Tea extends Beverage{
public void brew(){
//原来的steepTeaBag();
}
public void addCondiments(){
//原来的addCondiments();
}
}
public class Coffee extends Beverage{
public void brew(){
//原来的brewCoffeeGrinds();
}
public void addCondiments(){
//原来的addSugarAndMilk();
}
}
不知道你有没有发现,现在的茶和咖啡的类甚至都不需要事先冲泡的方法,只需要告诉模板自己特有的冲泡方法和调料即可。
原来重复的代码都消失了!
通过模板方法模式,算法的结构和算法的具体内容实现了解耦,子类并不需要明确的知道算法的整体步骤,只需要知道自己需要重新定义的算法就可以了。而对被继承的类而言,他也不需要知道子类具体实现了什么,只需要保证算法整体的骨架就可以了。
最后是模板方法模式的类图: