模板模式说明
模板是对多种事物的结构、形式、行为的模式化总结,而模板方法模式(Template Method)则是对一系列类行为(方法)的模式化
基类定义了一套模板(不可变),供子类继承,子类可以扩展(可变),丰富自己的业务场景
当然,对于基类模板中的步骤方法并不是必须要用抽象方法,而是完全可以用实体方法去实现一些通用的操作,灵活设计,如果子类需要个性化就对其进行重写变更,不需要就直接继承。根据场景进行适当的变通,才能对设计模式更灵活、更恰当的运用。
模板方法模式巧妙地结合了抽象类虚部方法与实部方法,分别定义了可变部分与不变部分,其中前者留给子类去实现,保证了系统的可扩展性;而后者则包含一系列对前者的逻辑调用,为子类提供了一种固有的应用指导规范,从而达到虚中带实、虚实结合的状态。
模板方法模式的各角色定义如下
● AbstractClass(抽象基类):定义出原始操作步骤的抽象方法(primitiveOperation)以供子类实现,并作为在模板方法中被调用的一个步骤。此外还实现了不可重写的模板方法,其可将所有原始操作组织起来成为一个框架或者平台。
● ConcreteClassA、ConcreteClassB(实现类A、实现类B):继承自抽象基类并且对所有的原始操作进行分步实现,可以有多种实现以呈现每个步骤的多样性。
示例代码
package com.azure.design.template;
/**
* 瀑布模型模版抽象类
*/
public abstract class PM {
public abstract String analyze (); //需求分析
public abstract String design (String projec); //软件设计
public abstract String develop (String projec); //代码开发
public abstract boolean test (String project); // 测试
public abstract void release (String project); // 发布
protected final void kickoff () {
String requirement = analyze ();
String designCode = design (requirement);
do{
designCode = develop(designCode);
} while(!test(designCode)); //如果测试失败则需修改
release (designCode);
}
}
package com.azure.design.template;
public class HRProject extends PM{
@Override
public String analyze() {
System.out.println("需求分析");
return "人力项目完成需求分析";
}
@Override
public String design(String projec) {
System.out.println("程序设计");
return projec;
}
@Override
public String develop(String projec) {
System.out.println("程序开发");
return projec;
}
@Override
public boolean test(String project) {
System.out.println("程序测试");
return true;
}
@Override
public void release(String project) {
System.out.println("程序发布");
System.out.println("项目验证");
System.out.println("================项目上线成功==================");
}
}
资料引用
刘韬《秒懂设计模式》