设计模式,六大设计原则,类的特性
总纲
http://blog.csdn.net/fenglailea/article/details/52733435
风.fox
模版方法模式
定义一个操作中的算法框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
通用类图
模版方法模式确实非常简单,仅仅使用了JAVA/PHP语言的继承机制,但它是一个应用非常广泛的模式。
AbstractClass叫做抽象模版,他的方法分为两类:
1. 基本方法
基本方法也叫基本操作,是由子类实现的方法,并且在模版方法中调用
2. 模版方法
可以有一个或几个,一般是一个具体方法,也就是一个框架实现对基本方法的调度,完成固定的逻辑
案例
JAVA
//抽象模版类
public abstract class AbstractClass{
//基本方法
protected void doAnything();
//基本方法
protected void doSomething();
//模版方法
protected void templateMethod(){
/**
* 调用基本方法,完成相关的逻辑
*/
this.doAnything();
this.doSomething();
}
}
//具体模版类
public class ConcreteClass1 extends AbstractClass{
//实现基本方法
protected void doAnything(){
...
}
protected void doSomething(){
...
}
}
public class ConcreteClass2 extends AbstractClass{
//实现基本方法
protected void doAnything(){
...
}
protected void doSomething(){
...
}
}
//场景类
public class Client{
public static void main(String[] args){
AbstractClass class1=new ConcreteClass1();
AbstractClass class2=new ConcreteClass2();
class1.templateMethod();
class2.templateMethod();
}
}
抽象模版中的基本方法尽量设计为protected类型,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected类型。
实现类若非必要,尽量不要扩大父类中的访问权限
优点
封装不变部分,扩展可变部分
提取公共部分代码,便于维护
行为由父类控制,子类实现
使用场景
多个子类有公有的方法,并且逻辑基本相同时
重要、复杂的算法,可以把核心算法设计为模版方法,周边的相关细节功能则由各个子类实现
重构时,模版方法是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为