模板方法模式
定义
模板方法模式(Template Method Pattern):
定义一个操作中算法的框架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤.
模板方法是一种类行为型模式.
举例
请客吃饭:
- 点单
- 吃东西
- 买单
模板方法模式:
•基本方法(“点单”、“吃东西”和“买单”)
•模板方法( “请客”)
模式结构
•AbstractClass: 抽象类
•ConcreteClass: 具体子类
模板方法模式优点:
在父类中形式化地定义一个算法,而由它的子类来实现细节的处理,在子类实现详细的处理算法时并不会改变算法中步骤的执行次序
提取了类库中的公共行为,将公共行为放在父类中,而通过其子类来实现不同的行为
可实现一种反向控制结构,通过子类覆盖父类的钩子方法来决定某一特定步骤是否需要执行
更换和增加新的子类很方便,符合单一职责原则和开闭原则
模板方法模式缺点:
需要为每一个基本方法的不同实现提供一个子类,如果父类中可变的基本方法太多,将会导致类的个数增加,系统会更加庞大,设计也更加抽象
实例
1 定义抽象的父类
package templatemethod;
public abstract class BankTemplateMethod {
public BankTemplateMethod() {
}
public void takeNumber() {
System.out.println("取号排队。");
}
public abstract void transact();
public void evaluate() {
System.out.println("反馈评分。");
}
public void process() {
this.takeNumber();
this.transact();
this.evaluate();
}
}
2 定义几种不同的子类
package templatemethod;
public class Deposit extends BankTemplateMethod {
public Deposit() {
}
public void transact() {
System.out.println("存款");
}
}
package templatemethod;
public class Transfer extends BankTemplateMethod {
public Transfer() {
}
public void transact() {
System.out.println("转账");
}
}
package templatemethod;
public class Withdraw extends BankTemplateMethod {
public Withdraw() {
}
public void transact() {
System.out.println("取款");
}
}
3 测试
package templatemethod;
public class Client
{
public static void main(String a[])
{
BankTemplateMethod bank1=new Deposit();
bank1.process();
System.out.println("---------------------------------------");
BankTemplateMethod bank2=new Transfer();
bank2.process();
System.out.println("---------------------------------------");
BankTemplateMethod bank3=new Withdraw();
bank3.process();
System.out.println("---------------------------------------");
}
}
取号排队。
存款
反馈评分。
---------------------------------------
取号排队。
转账
反馈评分。
---------------------------------------
取号排队。
取款
反馈评分。
---------------------------------------
取号排队。
转账
反馈评分。
---------------------------------------
取号排队。
取款
反馈评分。
---------------------------------------