设计模式学习笔记(七)之模板方法模式(Template Method)
最近实习工作稍微没有那么忙了,继续抽些晚上时间学习一下设计模式,以下是看设计模式书的学习笔记,关于模式定义之类的内容是在自己理解之后进行摘录的,希望对大家有用;
代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870
(一)模板方法定义:
定义一个操作中的方法的框架,可以把一些具体要做的步骤放入到子类中,可以让子类可以不去改变整个方法的结构,重新去定义并且实现该框架中的算法的步骤;
直接看个例子吧:
【情景】假如你现在是一家汽车设计模型的工厂,拿到一个生产汽车的订单,不考虑其他的汽车要求,只要保证汽车最基本的功能(发动,刹车,鸣笛,开起来),这样一般工厂会了提高效率,降低成本,会先设计一套包含基本功能的模板,具体到某辆汽车的时候,为该汽车实现具体的方法;下面就用汽车的例子,先看下类图:
汽车模型模板抽象类中定义四个基本的模板方法,具体的要生产的汽车类,去实现模板抽象方法,根据需要实际实现其中的方法;看代码;
汽车模板方法抽象类:
package com.jiangqq.template02;
/**
* 汽车的模板方法 公共抽象类
* @author jiangqq
* @see <a href http://blog.csdn.net/jiangqq781931404>CSDN博客</a>
*/
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 <a href http://blog.csdn.net/jiangqq781931404>CSDN博客</a>
*/
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();
}
}
模板方法的特点(摘录自大话设计模式):
模板方法模式是通过把不变形为搬移到超类(父类),这样去除了子类中的重复代码,这样也达到了一个代码复用的效果
模板方法的优点:
- 封装不变部分,扩展可变部分
- 提取公共部分的代码,便于维护
- 整个的方法行为让父类去控制,子类负责实现
代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870