LieBrother公众号原文:
行为型模式:模板方法java
十一大行为型模式之一:模板方法。git
姓名 :模板方法github
英文名 :Template Method Pattern算法
价值观 :在个人掌控下,任由你发挥设计模式
我的介绍 :框架
Define the skeleton of an algorithm in an operation,deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm's structure.
定义一个操做中的算法的框架,而将一些步骤延迟到子类中。使得子类能够不改变一个算法的结构便可重定义该算法的某些特定步骤。
(来自《设计模式之禅》)ide
解释一下上面的介绍,意思是由父类来定义框架,让子类来具体实现。测试
刚过完春节,你们都买新鞋了么?今天要讲的故事和鞋子有关。一双鞋子从表面来看,由鞋底、鞋垫、鞋面、鞋带组成,同一系列的鞋子这几个部分都是同样的,用一样的材料作出来,不一样系列的鞋子就截然不同了。根据模板方法模式,组装一双鞋子的制造过程能够归并为固定的框架,至于用什么材料,那由每一个系列的鞋子去具体实现。咱们先看定义组装鞋子的框架代码。设计
/** * 定义鞋子制造的工序框架 */ abstract class ShoeInstallTemplate { public abstract void installSole(); public abstract void installInsole(); public abstract void installVamp(); public abstract void installShoelace(); public void installShot(){ System.out.println("组装一双鞋,步骤以下:"); // 组装鞋底 installSole(); // 组装鞋垫 installInsole(); // 组装鞋面 installVamp(); // 组装鞋带 installShoelace(); } }
定义了一个组装鞋子框架的抽象类 ShoeInstallTemplate,里面有 4 个工序未具体实现,由鞋子制造商去实现,由于只有鞋子制造商才知道鞋子要用什么材料来作。
下面举 2 个比较出名的鞋子:Adidas 的 Boost 系列和 Nike 的 Jordan 系列。下面分别实现这 2 个系列鞋子的制造代码。code
/** * Adidas Boost 鞋制造 */ class AdidasBoostShoeInstall extends ShoeInstallTemplate { @Override public void installSole() { System.out.println("组装白色 Boost 鞋底"); } @Override public void installInsole() { System.out.println("组装黑色 Boost 鞋垫"); } @Override public void installVamp() { System.out.println("组装黑色 Boost 鞋面"); } @Override public void installShoelace() { System.out.println("组装黑色 Boost 鞋带"); } } /** * Nike Jordan 鞋制造 */ class NikeJordanShoeInstall extends ShoeInstallTemplate { @Override public void installSole() { System.out.println("组装黑色 Jordan 鞋底"); } @Override public void installInsole() { System.out.println("组装黑色 Jordan 鞋垫"); } @Override public void installVamp() { System.out.println("组装红色 Jordan 鞋面"); } @Override public void installShoelace() { System.out.println("组装红色 Jordan 鞋带"); } }
实现了制造商制造鞋子的代码以后,咱们经过代码测试怎么制造 Boost 和 Jordan 鞋子。
public class TemplateMethodTest { public static void main(String[] args) { ShoeInstallTemplate adidasBoost = new AdidasBoostShoeInstall(); adidasBoost.installShot(); ShoeInstallTemplate nikeJordan = new NikeJordanShoeInstall(); nikeJordan.installShot(); } } 打印结果: 组装一双鞋,步骤以下: 组装白色 Boost 鞋底 组装黑色 Boost 鞋垫 组装黑色 Boost 鞋面 组装黑色 Boost 鞋带 组装一双鞋,步骤以下: 组装黑色 Jordan 鞋底 组装黑色 Jordan 鞋垫 组装红色 Jordan 鞋面 组装红色 Jordan 鞋带
模板方法模式就这么简单。是否是掌握了?
模板方法是一个比较实用的模式,为何说实用呢?举个现实的例子,Java 能有现在的发展,离不开各大开源框架,好比 Dubbo,有看过源码的朋友就知道,里面大量代码运用了模板方法设计模式,为何 Dubbo 能够支持不少种注册中心?其实本质就是用了模板方法设计模式,使得能够扩展多种注册中心。掌握好模板方法,对读源码有很是大的帮助,不少人包括我在内,在刚开始阅读源码的时候,有至关长的一段时间怀疑人生,怎么这些代码那么绕?调来调去的。当你了解了经常使用的设计模式以后,看源代码就能够直截了当的知道是用什么设计模式,为何用这个设计模式?原来是为了什么什么。。。有了这层思考,就像有一条线将之前散落在各地的知识点链接起来,成了能够推敲的知识。
参考资料:《大话设计模式》、《设计模式之禅》
推荐阅读: