设计模式--模板方法模式

来源:互联网 发布:百度聚合数据 编辑:程序博客网 时间:2024/05/21 07:13

模板方法模式的核心是预先定义好过程,而将过程的实现推迟到子类

举个超市购物的例子

public abstract  class Shopping{     public void  doShopping(){      pickup();      pay();   }    public abstract void pickup();   public abstract void pay(); }


我们很明显知道购物分两个过程1 挑选商品,2 付账。 

过程的流程是确定不变的,但是过程的实现可能改变,比如说买包装好的商品,我们关注的是生产日期,而我们在挑选蔬果的时候注重的是产品的新鲜程度,或者 部分商品只收cash,部分商品只收check。


这样我们可能会得到如下子类

public class BuyEggs extends  Shopping{     public void  doShopping(){      pickup();      pay();   } //挑选鸡蛋   public abstract void pickup(){ ....};//pay in cash  public abstract void pay(){ ...}; }public class  BuyBed  extends Shopping{    public void  doShopping(){      pickup();      pay();   } //挑选床   public abstract void pickup(){ ....};//pay in check  public abstract void pay(){ ...}; }


简单来说模板方法模式是把相似工作流程的类的共同部分抽取出来形成一个高层抽象类,运行实现类对抽象类的方法进行复写达到个性化实现的目的。

在主程序中我们需要通过高层抽象类来调用具体类的实现,这样就解除了程序对具体类的依赖


在java中  comparable接口也是模板方法的一个实现,   另外工厂模式部分的工厂方法也是模板方法的一个特例。


在模板方法模式中存在一个·钩子· 的概念,他指的是那些预先定义好的,会影响到程序实现的方法。

public abstract  class Shopping{     public void  doShopping(){      pickup();      pay(isSalesPromotion());   }    public abstract void pickup();   public abstract void pay(boolean isSales);    public boolean isSalesPromotion(){return false }}
我们把之前购物的接口修改成这样,这里  isSalesPromotion  就是我们预留的一个钩子,我们可以通过复写这个来达到促销这个目的,比如每月某几天有促销什么的,或者用会员卡或者折扣券享受促销。


在jFrame里面  paint方法 就是一个典型的钩子,我们通过复写这个可以达到在frame上绘制的目的。

JEE的 servlet中对session生命周期的监听也是钩子的典型的案例

0 0
原创粉丝点击