设计模式之禅之设计模式-模板方法模式
一:模板方法模式的定义
--->定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
--->模板方法模式确实非常简单,仅仅使用了Java的继承机制,但它是一个应用非常广泛的模式。其中,AbstractClass叫做抽象模板,它的方法分为两类:
● 基本方法
基本方法也叫做基本操作,是由子类实现的方法,并且在模板方法被调用。
● 模板方法
可以有一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑。
二:模板方法模式的优点
● 封装不变部分,扩展可变部分
● 提取公共部分代码,便于维护
● 行为由父类控制,子类实现
三:模板方法模式的缺点
按照我们的设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但是模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行的结果影响了父类的结果,也就是子类对父类产生了影响,这在复杂的项目中,会带来代码阅读的难度,而且也会让新手产生不适感。
四:模板方法模式的应用场景
● 多个子类有公有的方法,并且逻辑基本相同时。
● 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。
● 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数(见“模板方法模式的扩展”)约束其行为。
五:模板方法模式的例子
模板方法抽象类(算法框架)
1 package com.yeepay.sxf.template5; 2 /** 3 * 模板类 4 * (1)封装算法的总实现方法 5 * (2)核心步骤定义抽象方法,让子类具体实现 6 * 7 * @author sxf 8 * 9 */ 10 public abstract class AbstractTemplate { 11 /** 12 * 核心步骤一 13 */ 14 protected abstract void step01(); 15 /** 16 * 核心步骤二 17 */ 18 protected abstract void step02(); 19 /** 20 * 核心步骤三 21 */ 22 protected abstract void step03(); 23 24 /** 25 * 算法实现类 26 */ 27 public void run(){ 28 this.step01(); 29 this.step02(); 30 this.step03(); 31 } 32 }
模板方法实现类(算法实现一)
1 package com.yeepay.sxf.template5; 2 /** 3 * Jack的算法 4 * @author sxf 5 * 6 */ 7 public class JackAlgorithm extends AbstractTemplate{ 8 9 @Override 10 protected void step01() { 11 System.out.println("JackAlgorithm.step01(==》jack算法第一步)"); 12 } 13 14 @Override 15 protected void step02() { 16 System.out.println("JackAlgorithm.step02(==》jack算法第二步)"); 17 } 18 19 @Override 20 protected void step03() { 21 System.out.println("JackAlgorithm.step03(==》jack算法第三步)"); 22 } 23 24 25 }
模板方法实现类(算法实现二)
1 package com.yeepay.sxf.template5; 2 /** 3 * Tom的算法 4 * @author sxf 5 * 6 */ 7 public class TomAlgorithm extends AbstractTemplate { 8 9 @Override 10 protected void step01() { 11 System.out.println("TomAlgorithm.step01(==》Tom算法第一步)"); 12 } 13 14 @Override 15 protected void step02() { 16 System.out.println("TomAlgorithm.step02(==》Tom算法第二步)"); 17 } 18 19 @Override 20 protected void step03() { 21 System.out.println("TomAlgorithm.step03(==》Tom算法第三步)"); 22 } 23 24 25 }
客户端实现
1 package com.yeepay.sxf.template5; 2 /** 3 * 测试类 4 * @author sxf 5 * 6 */ 7 public class Client { 8 public static void main(String[] args) { 9 //实现Jack的算法 10 AbstractTemplate jack=new JackAlgorithm(); 11 jack.run(); 12 13 //实现Tom的算法 14 AbstractTemplate tom=new TomAlgorithm(); 15 tom.run(); 16 } 17 }