青玄 发表于 2015-1-22 16:09:39

java设计模式之模板方法模式

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。也就是说,我们先做一个抽象类,然后里面加一些未实现的方法,其中有一个方法是final声明的,这个方法它是调用这些未实现的方法的,而这个抽象类需要子类来继承,来实现这些未实现的方法,然后再写一个测试类,实例化这个子类,然后调用那个final的方法就可以啦! 呵呵! 小弟说的很不专业,不过大概的流程就是这样的,还望高手不要见怪!

首先写一个抽象类:

public abstract class TemplateMethodPattern
{
/**
   * 首先,这个模型要能够被发动起来,别管是手摇发动,
   * 反正是要能够发动起来,那这个实现要在实现类里啦
   */

protected abstract void start();
//能发动,还要能停下来
protected abstract void stop();
//喇叭会出声音,是滴滴叫,还是哗哗叫
protected abstract void alarm();
//引擎会轰隆隆的向,不响那是假的
protected abstract void engineBoom();
//那模型应该会跑吧! 别管是人推的,还是电力驱动,总之要会跑
final public void run()
{
   //先发动汽车
   this.start();
   //引擎开始轰鸣
   this.engineBoom();
   //喇叭想让它响就响,不想让它响就不响
   if(this.isAlarm())
   {
       this.alarm();
   }
   //到达目的地就停车
   this.stop();
}
   //钩子方法,默认喇叭是会响的
   protected boolean isAlarm()
   {
      return true;
   }
}

注意: protected boolean isAlarm()这个方法的返回值,实在子类中进行操作的,它里面有一个设置喇叭会不会响的一个方法,然后将设置后的boolean值传进来然后就在run里面就判断,如果是true的话,那就鸣笛,否则就不响;

下面就是实现抽象类的子类:

public class HummerH1Model extends TemplateMethodPattern
{
   private boolean alarmFlag = true;//是否要响喇叭

   protected void alarm()
   {
      System.out.println("悍马h1鸣笛...");
   }

   protected void engineBoom()
   {
   System.out.println("悍马h1引擎声音是这样....");
   }

   protected void start()
   {
      System.out.println("悍马h1发动...");
   }

   protected void stop()
   {
      System.out.println("悍马h1停车...");
   }

   protected boolean isAlarm()
   {
      return this.alarmFlag;
   }

   //要不要响喇叭,是有客户来决定的
   public void setAlarm(boolean isAlarm)
   {
   this.alarmFlag = isAlarm;
   }

}
然后就是测试的类:

public class CLient2
{
   public static void main(String args[])
   {
       HummerH1Model h1 = newHummerH1Model();
       h1.setAlarm(true);
       h1.run();   //汽车跑起来啦
   }
}






页: [1]
查看完整版本: java设计模式之模板方法模式