设计模式—模板方法模式(template)
模板方法模式,我们来看一下定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。
我们来定义程序员的一天,这是一个抽象类,里面定义一个名字以及单参数的构造器,用于传递不同的职业在一天不同的行为。我们这里定义了四种角色,来展示他们的
一天,分别是程序员,测试,hr,项目经理的一天。我们抽出他们共有的行为,进入公司,离开公司,打开电脑,关闭电脑。唯一的区别在于他们的工作内容不同,这样
我们定义这样的一个模板,将模板类定义为抽象类,让不同的职业去具体实现这些工作的细节。因为他们的行为的模板是一样的,因此可以用final来修饰这些方法,work方法
我们具体去实现。下面我们来看具体的模板方法。
public abstract class Worker {
protected String name;
public Worker(String name) {
this.name = name;
}
public final void workOneDay() {
System.out.println("-------enter company--------");
company_on();
open_computer();
work();
close_computer();
company_off();
System.out.println("-------department company--------");
}
public abstract void work();
public final void company_on() {
System.out.println(name + "进入公司");
}
public final void open_computer() {
System.out.println(name + "打开电脑");
}
public final void close_computer() {
System.out.println(name + "关闭电脑");
}
//钩子
public boolean isNeedPrintDate() {
return false;
}
/**
* 离开公司
*/
public void company_off() {
if (isNeedPrintDate()) {
System.out.print(new Date().toLocaleString() + "-->");
}
System.out.println(name + "离开公司");
}
}
我们来看程序员的具体实现public class ITWorker extends Worker {
public ITWorker(String name) {
super(name);
}
@Override
public void work() {
System.out.println(name + "写程序-测bug-fix bug");
}
@Override
public boolean isNeedPrintDate() {
if ("Avecle".equals(name)) {
return true;
}
return false;
}
}
HR的具体实现
public class HRWorker extends Worker{
public HRWorker(String name) {
super(name);
}
@Override
public void work() {
System.out.println(name + "看简历-打电话-接电话");
}
}
测试的具体实现
public class QRWorker extends Worker{
public QRWorker(String name) {
super(name);
}
@Override
public void work() {
System.out.println(name + "写测试用例-提交bug-写测试用例");
}
}
项目经理的具体实现
public class ManagerWorker extends Worker {
public ManagerWorker(String name) {
super(name);
}
@Override
public void work() {
System.out.println(name + "打dota...");
}
}
四个职业的具体实现我们我们写完了,我们来写测试类
public class Test {
//模板方法模式
public static void main(String[] args) {
{
Worker it1 = new ITWorker("Avecle");
it1.workOneDay();
Worker it2 = new ITWorker("老张");
it2.workOneDay();
Worker hr = new HRWorker("迪迪");
hr.workOneDay();
Worker qa = new QRWorker("老李");
qa.workOneDay();
Worker pm = new ManagerWorker("坑货");
pm.workOneDay();
}
}
}
运行结果如下:
下面看下模版方法模式类图,和我们程序的类图:
模板方法相当于定义了一个总体的框架,封装了一些不变的方法属性,将变得部分抽象化,定义为抽象方法,等待具体的实现。在模板方法中我们也可以定义钩子,
超类中可提供默认实现或者空实现,子类可覆盖或者不覆盖,具体根据需求来定。
参考鸿洋,csdn地址为:http://blog.csdn.net/lmj623565791/article/details/26276093