MyException - 我的异常网
当前位置:我的异常网» 设计模式 » 设计模式(四)-模板方法模式详解(易懂)

设计模式(四)-模板方法模式详解(易懂)

www.MyException.Cn  网友分享于:2013-02-03  浏览:0次
设计模式(4)-模板方法模式详解(易懂)

模板方法模式定义

模板方法模式(Template Method Pattern):定义一个操作中算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。模板方法是一种类行为型模式。

从模型图来看,模板方法模式很简单,但是很常用。抽象模板(AbstractClass)中的方法基本分两类:

  • 基本方法:子类去实现的方法 ,并且在模板方法中被调用。

  • 模板方法:把基本操作方法组合在一起形成一个总算法或一个总行为的方法;一个抽象类可以有任意多个模板方法,而不限于一个。每一个模板方法都可以调用任意多个具体方法。

具体模板(ConcreteClass)主要是实现父类定义的抽象的基本方法。

模板方法模式实例+扩展

例子:给两种手机做测试的,测试包括“开机,检查,关机”三种操作。下面用具体的代码来说明:

 1.抽象类

public abstract class TestModel  {

   //开机
   protected abstract  void open();
   //检查
   protected abstract  void check();
   //关闭
   protected abstract  void close();
   //模板方法-测试
   public void  test(){
       this.open();;
       this.check();
       this.close();
   }
}

 

2.两个实现类Phone1,Phone2

public class Phone1 extends  TestModel {
   @Override
   protected void open() {
       System.out.println("phone1的开机逻辑");
   }

   @Override
   protected void check() {
       System.out.println("phone1的检查逻辑");
   }

   @Override
   protected void close() {
       System.out.println("phone1的关机逻辑");
   }
}

public class Phone2 extends TestModel {
   @Override
   protected void open() {
       System.out.println("phone2的开机逻辑");
   }

   @Override
   protected void check() {
       System.out.println("phone2的检查逻辑");
   }

   @Override
   protected void close() {
       System.out.println("phone2的关机逻辑");
   }
}

 

3.调用

TestModel testModel1=new Phone1();
TestModel testModel2=new Phone2();

       testModel1.test();
       testModel2.test();

 

运行的结果如下:

 

二.扩展

如果phone1在测试中需要关机,而phone2不需要关机,这时需要一个钩子方法

 1.抽象类

public abstract class TestModel  {

   //开机
      protected abstract  void open();
   //检查
   protected abstract  void check();
   //关闭
   protected abstract  void close();
   //模板方法-测试
   public void  test(){
       this.open();;
       this.check();
       if (isClose()){
           this.close();  
       }
     
   }

   //钩子方法,默认是关机
   protected  boolean  isClose(){
       return  true;
   }
}

 

2.实现类

public class Phone1 extends  TestModel {
   public   boolean  isClose=true;

   public  void  setIsClose(boolean isClose){
       this.isClose=isClose;
   }

   protected  boolean  isClose(){
       return this.isClose;
   }
   @Override
   protected void open() {
       System.out.println("phone1的开机逻辑");
   }

   @Override
   protected void check() {
       System.out.println("phone1的检查逻辑");
   }

   @Override
   protected void close() {
       System.out.println("phone1的关机逻辑");
   }


}


public class Phone2 extends TestModel {
   @Override
   protected void open() {
       System.out.println("phone2的开机逻辑");
   }

   @Override
   protected void check() {
       System.out.println("phone2的检查逻辑");
   }

   @Override
   protected void close() {
       System.out.println("phone2的关机逻辑");
   }

   //因为是取消关机,所以直接返回false就可以了
   protected  boolean  isClose(){
       return false;
   }
}

 

3.调用

       Phone1 testModel1=new Phone1();
       Phone2 testModel2=new Phone2();
    //phone1
       testModel1.setIsClose(true);
       testModel1.test();
    //phone2
       testModel2.test()
    

模板方法模式的优缺点及应用

 1.优点

  • 封装不变部分,扩展可变的部分。

  • 提取了公共的代码,减少代码量,方便维护。

  • 父类控制方法,子类去实现。

2.缺点

  • 代码的阅读难度会增加,尤其是新手。我们习惯认为抽象类申明的是最抽象的、最一般的事物属性和方法,实现类完成具体的事物属性和方法;而在模板方法模式中,抽象类中定义了部分抽象方法,而子类实现父类后执行的结果影响了父类,子类对父类产生了影响。

3.应用

  • 重构

  • 规定算法

  • 抽取公共的逻辑

参考资料《大话设计模式》《设计模式之禅》

推荐阅读

 

 

    设计模式(2)-工厂方法模式详解(易懂)

    

    设计模式(3)-抽象工厂模式详解(易懂)

 

文章评论

为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
每天工作4小时的程序员
每天工作4小时的程序员
那些争议最大的编程观点
那些争议最大的编程观点
如何成为一名黑客
如何成为一名黑客
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
我的丈夫是个程序员
我的丈夫是个程序员
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
程序员必看的十大电影
程序员必看的十大电影
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
程序员应该关注的一些事儿
程序员应该关注的一些事儿
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
程序员和编码员之间的区别
程序员和编码员之间的区别
我是如何打败拖延症的
我是如何打败拖延症的
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
老程序员的下场
老程序员的下场
10个调试和排错的小建议
10个调试和排错的小建议
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
漫画:程序员的工作
漫画:程序员的工作
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
旅行,写作,编程
旅行,写作,编程
 程序员的样子
程序员的样子
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
Java程序员必看电影
Java程序员必看电影
鲜为人知的编程真相
鲜为人知的编程真相
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
一个程序员的时间管理
一个程序员的时间管理
为什么程序员都是夜猫子
为什么程序员都是夜猫子
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
程序员都该阅读的书
程序员都该阅读的书
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
程序员的鄙视链
程序员的鄙视链
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
2013年美国开发者薪资调查报告
2013年美国开发者薪资调查报告
编程语言是女人
编程语言是女人
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
代码女神横空出世
代码女神横空出世
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有