详解模板方法设计模式
分享一波:程序员赚外快-必看的巅峰干货
概念
定义一个操作中的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的重复代码全部在父类里面,不同业务的,使用抽象方法,抽取给子类进行实现。抽取过程—抽象方法。
核心:处理某个流程的代码已经都具备,但是其中某个节点的代码暂时不能确定。因此,我们采用工厂方法模式,将这个节点的代码实现转移给子类完成。即:处理步骤在父类中定义好,具体的实现延迟到子类中定义。
案例流程
去银行办业务,银行给我们提供了一个模板就是:先取号,排对,办理业务(核心部分我们子类完成),给客服人员评分,完毕。这里办理业务是属于子类来完成的,不同的银行业务不同,即使同一个银行也会有不同的业务,因此办理业务的逻辑是抽象方法,其他的取号,排队,评分则是一个模板(有实际逻辑的方法)。
去餐厅点餐,点餐的逻辑模板为:点菜,做菜,吃饭,付款。点菜和付款的逻辑是一个模板,而不同的菜、不同的饭店做菜逻辑是不一样的,因此做菜是一个抽象方法,供子类去实现定义。
代码案例
以发送短信为案例。在发送短信前后,需要进行日志记录。发送前记录接收方号码、发送时间、内容,发送后需要记录发送结果,这两个步骤是固定的,而三大运营商发送短信的逻辑则可能有所不同,因此该方法作为抽象方法给运营商去实现,代码如下:
public abstract class MsgTemplate {
public void sendMsg() {
//1.开始日志报文
addHeadLog();
//2.调用具体不通运营商发送短信
httpRequest();
//3.结束日志报文
addFootLog();
}
/**
* 模板方法,子类去实现
*/
abstract void httpRequest();
private void addFootLog() {
System.out.println("调用运营商结束记录日志...");
}
private void addHeadLog() {
System.out.println("调用运营商开始记录日志...");
}
}
// -----
中间编写实现类,移动、联通、电信三大运营商,继承模板类重写模板方法。
下面为调用示例,具体代码不再编写。
// ----
MsgTemplate yidong = new YiDong();
yidong.sendMsg();
与代理模式的异同
模板方法设计模式与代理设计模式都在方法前或后执行了一些代码逻辑,但是二者的核心思想差别很大
相同之处:模板方法设计模式与代理设计模式的相同之处在于,都在特定的方法前或后分别执行了不同的逻辑。
不同之处:代理设计模式的思想是帮助被代理类去执行某个方法,而这个方法与代理类是无关的。同时,代理设计模式知道所代理的是哪些类。模板方法设计模式的思想是提供一套模板,其中一些步骤的代码已经得到了具体的实现,而有部分代码则交由子类去进行实现。模板方法模式提供了一套模板,是提供者,子类则去实现相应的抽象方法,而模板的提供者并不知道这套模板将来会被什么类去使用。