设计模式 (十四)模板方法模式(Template)

来源:互联网 发布:办公室软件excel教程 编辑:程序博客网 时间:2024/05/17 22:51

模板方法模式(Template)是行为模式之一,其就是简单定义一个算法执行骨架,而将其具体的算法延迟到子类中实现,从而使出现过多的类的时候不用再改变算法和结构直接添加一个实现子类就可以了。

一般在具体统一的操作步骤和业务功能,但是具有不同的细节处理,这样用模板方法模式减少了代码的复用

下面简单的看看模板方法模式的原理图:

实例对象对于抽象类的继承,展开了具体的细节功能的处理,下面把模式应用到具体的实例:

简单的对于我们每天吃饭的情况(我旁边的各种情况),用一个普通的人作为吃饭的抽象类,然后定义吃早饭午饭晚饭都吃什么,通过不同的人对吃饭的要求也不一样对了一个小例子:

XHW分别是三种人,然后都有固定的一日三餐,但是吃的方式是不一样的:

[java] view plaincopy
  1. package com.designpattern.template;  
  2.   
  3. public abstract class Person {  
  4.   
  5.     public void eat() {  
  6.         breakfast();  
  7.         lunch();  
  8.         dinner();  
  9.     }  
  10.   
  11.     public abstract void breakfast();  
  12.   
  13.     public abstract void lunch();  
  14.   
  15.     public abstract void dinner();  
  16. }  

这里定义抽象类就是用来继承的,同时里面的eat是非抽象方法,这样子类可以不继承,直接实现父类指针指向子类,同时调用方法,但是对于早上中午晚上的方法,只必须要子类去继承的,所以就抽象了一下:
[java] view plaincopy
  1. package com.designpattern.template;  
  2.   
  3. public class X extends Person {  
  4.   
  5.     @Override  
  6.     public void breakfast() {  
  7.         System.out.println("早晨先吃两个麦面包片再喝一袋奶吃一个鸡蛋");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void dinner() {  
  12.         System.out.println("中午去食堂三楼吃牛肉罩饼");  
  13.     }  
  14.   
  15.     @Override  
  16.     public void lunch() {  
  17.         System.out.println("晚上去食堂一楼吃饺子在来一碗盖饭");  
  18.     }  
  19.   
  20. }  
[java] view plaincopy
  1. <pre name="code" class="java">package com.designpattern.template;  
  2.   
  3. public class W extends Person {  
  4.   
  5.     @Override  
  6.     public void breakfast() {  
  7.         System.out.println("早晨没有时间吃早饭,于是就不吃了");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void dinner() {  
  12.         System.out.println("中午去食堂二楼吃两个馒头一个菜一碗粥");  
  13.     }  
  14.   
  15.     @Override  
  16.     public void lunch() {  
  17.         System.out.println("晚上去食堂三楼吃一个饼一盘菜一碗粥");  
  18.     }  
  19.   
  20. }  

[java] view plaincopy
  1. package com.designpattern.template;  
  2.   
  3. public class W extends Person {  
  4.   
  5.     @Override  
  6.     public void breakfast() {  
  7.         System.out.println("早晨没有时间吃早饭,于是就不吃了");  
  8.     }  
  9.   
  10.     @Override  
  11.     public void dinner() {  
  12.         System.out.println("中午去食堂二楼吃两个馒头一个菜一碗粥");  
  13.     }  
  14.   
  15.     @Override  
  16.     public void lunch() {  
  17.         System.out.println("晚上去食堂三楼吃一个饼一盘菜一碗粥");  
  18.     }  
  19.   
  20. }  

然后在Client端调用:

[java] view plaincopy
  1. package com.designpattern.template;  
  2.   
  3. public class Client {  
  4.     public static void main(String[] args) {  
  5.   
  6.         System.out.println("H");  
  7.         Person h = new H();  
  8.         h.eat();  
  9.         System.out.println();  
  10.           
  11.         System.out.println("W");  
  12.         Person w = new W();  
  13.         w.eat();  
  14.         System.out.println();  
  15.   
  16.         System.out.println("X");  
  17.         Person x = new X();  
  18.         x.eat();  
  19.         System.out.println();  
  20.     }  
  21. }  

输入内容如下

[html] view plaincopy
  1. H  
  2. 早晨一般不吃饭,减肥  
  3. 晚上去尚饮吃云吞什锦  
  4. 中午在外面买一点煎饼什么的吃点  
  5.   
  6. W  
  7. 早晨没有时间吃早饭,于是就不吃了  
  8. 晚上去食堂三楼吃一个饼一盘菜一碗粥  
  9. 中午去食堂二楼吃两个馒头一个菜一碗粥  
  10.   
  11. X  
  12. 早晨先吃两个麦面包片再喝一袋奶吃一个鸡蛋  
  13. 晚上去食堂一楼吃饺子在来一碗盖饭  
  14. 中午去食堂三楼吃牛肉罩饼  

这样就简单的实现了一个模板模式;

使用模板方法模式,在定义算法的骨架的同时,可以很灵活地实现具体的算法,满足用户灵活多变的需求。

虽然使用模板方法模式可以很自由滴实现具体的算法,但是如果算法的骨架有改变的话,则需要重新修改抽象类。