设计模式学习笔记(七)之模板方法模式(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(); } }

  模板方法的特点(摘录自大话设计模式):

  模板方法模式是通过把不变形为搬移到超类(父类),这样去除了子类中的重复代码,这样也达到了一个代码复用的效果

  

   模板方法的优点:

  • 封装不变部分,扩展可变部分
  • 提取公共部分的代码,便于维护
  • 整个的方法行为让父类去控制,子类负责实现

  

   代码下载链接: