1.什么是模板方法?
模板方法是由抽象基类定义一种算法骨架,将一些操作步骤延迟到子类实现。本质上是使用了Java的多态性。
2.简单示例。
钉钉(DingTalk)是阿里巴巴集团专为中国企业打造的免费沟通和协同的多端平台。这里以企业员工每天上班通过钉钉打卡为例,打卡的操作流程是:打开软件->打卡->打卡结果通知。其中第一步和第三步是固定的操作,但是第二步是不确定的,对于出差的同事打卡和不出差的同事打卡是不一样的。这里就可以使用模板方法来开发打卡的功能。
废话不多说,直接上代码:
(1)上班打卡抽象基类
package com.scott.template;
/**
* 上班打卡抽象基类
* @author Administrator
*
*/
public abstract class AbstractClockInTemplate {
/**
* 算法
*/
public final void process() {
// 1.登录打卡软件
login();
// 2.进行打卡
clockIn();
// 3.打卡结果通知
msgNotify();
}
private void login() {
System.out.println("登录打卡软件...");
}
protected abstract void clockIn();
private void msgNotify() {
System.out.println("恭喜你打卡成功!");
}
}
(2)正常打卡
package com.scott.template;
/**
* 正常打卡
* @author Administrator
*
*/
public class NormalClockIn extends AbstractClockInTemplate {
@Override
protected void clockIn() {
System.out.println("正常打卡...");
}
}
(3)外勤打卡
package com.scott.template;
/**
* 外勤打卡
* @author Administrator
*
*/
public class FieldWorkClockIn extends AbstractClockInTemplate {
@Override
protected void clockIn() {
System.out.println("外勤打卡...");
}
}
(4)客户端演示
package com.scott.client;
import com.scott.template.AbstractClockInTemplate;
import com.scott.template.FieldWorkClockIn;
import com.scott.template.NormalClockIn;
public class Test {
public static void main(String[] args) {
AbstractClockInTemplate normalClockIn = new NormalClockIn();
normalClockIn.process();
System.out.println("------------------------");
AbstractClockInTemplate fieldWorkClockIn = new FieldWorkClockIn();
fieldWorkClockIn.process();
}
}
结果:
登录打卡软件...
正常打卡...
恭喜你打卡成功!
------------------------
登录打卡软件...
外勤打卡...
恭喜你打卡成功!