鱼C论坛

 找回密码
 立即注册
查看: 1982|回复: 0

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

[复制链接]
发表于 2015-1-22 16:09:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x

模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。

也就是说,我们先做一个抽象类,然后里面加一些未实现的方法,其中有一个方法是final声明的,这个方法它是调用这些未实现的方法的,而这个抽象类需要子类来继承,来实现这些未实现的方法,然后再写一个测试类,实例化这个子类,然后调用那个final的方法就可以啦! 呵呵! 小弟说的很不专业,不过大概的流程就是这样的,还望高手不要见怪!

首先写一个抽象类:

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

  7.   protected abstract void start();
  8.   //能发动,还要能停下来
  9.   protected abstract void stop();
  10.   //喇叭会出声音,是滴滴叫,还是哗哗叫
  11.   protected abstract void alarm();
  12.   //引擎会轰隆隆的向,不响那是假的
  13.   protected abstract void engineBoom();
  14.   //那模型应该会跑吧! 别管是人推的,还是电力驱动,总之要会跑
  15.   final public void run()
  16.   {
  17.      //先发动汽车
  18.      this.start();
  19.      //引擎开始轰鸣
  20.      this.engineBoom();
  21.      //喇叭想让它响就响,不想让它响就不响
  22.      if(this.isAlarm())
  23.      {
  24.        this.alarm();
  25.      }
  26.      //到达目的地就停车
  27.      this.stop();
  28.   }
  29.    //钩子方法,默认喇叭是会响的
  30.    protected boolean isAlarm()
  31.    {
  32.       return true;
  33.    }
  34. }
复制代码

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


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

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

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

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

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

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

  20.    protected boolean isAlarm()
  21.    {
  22.       return this.alarmFlag;
  23.    }

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

  29. }
复制代码
然后就是测试的类:


  1. public class CLient2
  2. {
  3.    public static void main(String args[])
  4.    {
  5.        HummerH1Model h1 = new  HummerH1Model();
  6.        h1.setAlarm(true);
  7.        h1.run();   //汽车跑起来啦
  8.    }
  9. }
复制代码

2015-01-22 16:11:27 的屏幕截图.png




本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 08:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表