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

模板方法模式定义

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

image

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

  • 基本方法:子类去实现的方法 ,而且在模板方法中被调用。
  • 模板方法:把基本操做方法组合在一块儿造成一个总算法或一个总行为的方法;一个抽象类能够有任意多个模板方法,而不限于一个。每个模板方法均可以调用任意多个具体方法。

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


模板方法模式实例+扩展

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

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,Phone2this

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.调用spa

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

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

运行的结果以下:设计

image

二.扩展code

若是phone1在测试中须要关机,而phone2不须要关机,这时须要一个钩子方法rem

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.应用

  • 重构
  • 规定算法
  • 抽取公共的逻辑

参考资料《大话设计模式》《设计模式之禅》
欢迎你们关注个人微信公众号:安卓干货铺

相关文章
相关标签/搜索