设计模式学习笔记(七)之模板方法模式(Template Method)
最近实习工作稍微没有那么忙了,继续抽些晚上时间学习一下设计模式,以下是看设计模式书的学习笔记,关于模式定义之类的内容是在自己理解之后进行摘录的,希望对大家有用;
代码下载链接:
(一)模板方法定义:
定义一个操作中的方法的框架,可以把一些具体要做的步骤放入到子类中,可以让子类可以不去改变整个方法的结构,重新去定义并且实现该框架中的算法的步骤;
直接看个例子吧:
【情景】假如你现在是一家汽车设计模型的工厂,拿到一个生产汽车的订单,不考虑其他的汽车要求,只要保证汽车最基本的功能(发动,刹车,鸣笛,开起来),这样一般工厂会了提高效率,降低成本,会先设计一套包含基本功能的模板,具体到某辆汽车的时候,为该汽车实现具体的方法;下面就用汽车的例子,先看下类图:
汽车模型模板抽象类中定义四个基本的模板方法,具体的要生产的汽车类,去实现模板抽象方法,根据需要实际实现其中的方法;看代码;
汽车模板方法抽象类:
package com.jiangqq.template02; /** * 汽车的模板方法 公共抽象类 * @author jiangqq * @see CSDN博客 */ public abstract class CarModel { //汽车发动 public abstract void start(); //汽车停止 public abstract void stop(); //汽车鸣笛 public abstract void ring(); //汽车启动运行 public abstract void run(); }下面是具体的汽车类的实现:
package com.jiangqq.template02; /** * 根据模板方法建造第一种类型的汽车 * * @author jiangqq * */ public class CarFirst extends CarModel { @Override public void start() { System.out.println("CarFirst开始发动......"); } @Override public void stop() { System.out.println("CarFirst开始刹车......"); } @Override public void ring() { System.out.println("CarFirst鸣笛......"); } @Override public void run() { this.start(); this.ring(); this.stop(); } } package com.jiangqq.template02; /** * 根据模板方法建造第一种类型的汽车 * * @author jiangqq * */ public class CarSecond extends CarModel { @Override public void start() { System.out.println("CarSecond开始发动......"); } @Override public void stop() { System.out.println("CarSecond开始刹车......"); } @Override public void ring() { System.out.println("CarSecond鸣笛......"); } @Override public void run() { this.start(); this.ring(); this.stop(); } }客户端测试代码:
package com.jiangqq.template02; public class ClientTest { public static void main(String[] args) { CarFirst carFirst=new CarFirst(); carFirst.run(); System.out.println("---------------------"); CarSecond carSecond=new CarSecond(); carSecond.run(); } }看上面的代码,我们发现每个具体要实现的类中的代码有相同的,而且run()方法都一样的,这样我们可以重新对它进行设计:再汽车模板抽象类中,不要把run()弄成抽象方法,具体看下面的代码
汽车模版抽象类:
package com.jiangqq.template03; /** * 汽车的模板方法 公共抽象类 * @author jiangqq * @see CSDN博客 */ public abstract class CarModel { //汽车发动 public abstract void start(); //汽车停止 public abstract void stop(); //汽车鸣笛 public abstract void ring(); //汽车启动运行 public void run() { this.start(); this.ring(); this.stop(); } }具体汽车中的代码和第一种例子的代码相比,少了run()方法,
客户端测试代码如下:
package com.jiangqq.template03; public class ClientTest { public static void main(String[] args) { CarModel carFirst=new CarFirst(); carFirst.run(); System.out.println("---------------------"); CarModel carSecond=new CarSecond(); carSecond.run(); } }
模板方法的特点(摘录自大话设计模式):
模板方法模式是通过把不变形为搬移到超类(父类),这样去除了子类中的重复代码,这样也达到了一个代码复用的效果
模板方法的优点:
- 封装不变部分,扩展可变部分
- 提取公共部分的代码,便于维护
- 整个的方法行为让父类去控制,子类负责实现
代码下载链接: