重分解以一般化” , 首先识别现有代码中的 不同之处 ,并且将不同之处分离为新的操作。最后,用一个调用这些新的操作的模板方法来替换这些不同的代码。
“ Hook Method(钩子方法) ”操作,这样就只允许在这些点进行扩展。
通用类图如下:
我们这里的类图会详细一点,如下:
具体代码实现如下:
abstract
class AbstractMethod {
protected
abstract
void method1();
protected
abstract
void method2();
// 模板方法,统一调用上面两个在子类中会被实现的方法,即不同的实现
public
final
void templateMethod() {
/*
* 此方法体内也可以通过“钩子方法”来实现根据一定情况调用 不同的方法组合
*/
if (hookMethod()) {
method1();
}
else {
method1();
method2();
}
}
// 钩子方法,protected权限可被子类覆盖,默认为返回true
protected
boolean hookMethod() {
return
true;
}
}
class ConcreteMethodA
extends AbstractMethod{
protected
void method1() {
System.out.println(
"子类 A :method1() ...");
}
protected
void method2() {
System.out.println(
"子类 A :method2() ...");
}
}
class ConcreteMethodB
extends AbstractMethod{
protected
void method1() {
System.out.println(
"子类 B :method1() ...");
}
protected
void method2() {
System.out.println(
"子类 B :method2() ...");
}
//覆盖钩子方法
protected
boolean hookMethod() {
return
false;
}
}
public
class Client {
public
static
void main(String[] args) {
AbstractMethod methodA =
new ConcreteMethodA();
methodA.templateMethod();
AbstractMethod methodB=
new ConcreteMethodB();
methodB.templateMethod();
}
}
AbstactMethod中的模板方法实际上是提供了一个外部可访问的接口,外部环境由该接口进入获得服务,而AbstractMethod类在此将子类可能提供不同服务给封装隐藏起来,即延迟了某些具体服务的细节,由其子类来负责实现。
templateMethod()简单地限制着,请参看上面例子的代码实现和测试结果。
转载于:https://blog.51cto.com/haolloyin/333063