设计模式学习笔记(七)之模板方法模式(Template Method)

           设计模式学习笔记(七)之模板方法模式(Template Method)

            最近实习工作稍微没有那么忙了,继续抽些晚上时间学习一下设计模式,以下是看设计模式书的学习笔记,关于模式定义之类的内容是在自己理解之后进行摘录的,希望对大家有用;

     代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870


             (一)模板方法定义:

             定义一个操作中的方法的框架,可以把一些具体要做的步骤放入到子类中,可以让子类可以不去改变整个方法的结构,重新去定义并且实现该框架中的算法的步骤;

             

             直接看个例子吧:

【情景】假如你现在是一家汽车设计模型的工厂,拿到一个生产汽车的订单,不考虑其他的汽车要求,只要保证汽车最基本的功能(发动,刹车,鸣笛,开起来),这样一般工厂会了提高效率,降低成本,会先设计一套包含基本功能的模板,具体到某辆汽车的时候,为该汽车实现具体的方法;下面就用汽车的例子,先看下类图:

     

      汽车模型模板抽象类中定义四个基本的模板方法,具体的要生产的汽车类,去实现模板抽象方法,根据需要实际实现其中的方法;看代码;

        汽车模板方法抽象类:

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();
}
}


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

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

  

   模板方法的优点:

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

  

   代码下载链接:http://download.csdn.net/detail/jiangqq781931404/4449870

    




                      

你可能感兴趣的:(设计模式)