您的位置:首页 > 其它

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

2012-07-24 19:15 806 查看
           设计模式学习笔记(七)之模板方法模式(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

    

                      
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐