设计模式-模板方法模式

发布于 2021-10-13 21:46

模板方法模式

定义

模板方法,定义一个操作的算法骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。主要解决一些方法通用,却在每一个子类都重新写了这一方法。现实中我们在造房子的时候,地基、走线、水管都一样,只有在建筑的后期才有加壁橱加栅栏等差异。这就是模板方法的一种体现。

模板方法使用场景:当要完成在某个过程,该过程要执行一系列步骤,这一系列的步骤基本相同,但其个别步骤 在实现时可能不同,通常考虑用模板方法模式来处理

特点

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

  • 提取公共代码,便于维护

  • 行为由父类控制,子类实现

  • 每一个不同的实现都需要一个子类来实现,导致类的个数增加,使得系统更加庞大

  • 实现了最大化代码复用。父类的模板方法和已实现的某些步骤会被子类继承而直接使用

  • 一般模板方法都加上final关键字,防止子类重写模板方法

状态模式的写法

以制作豆浆为案例,首先创建一个抽象abstract豆浆类,拥有final的makeSoyaMilk()模板方法,以及制作豆浆各个步骤的方法,如下:

package designPattern.behavioralPattern.TemplateMethodPattern;

/**
* 豆浆类
*/
public abstract class SoyaMilk {


   /*制作豆浆模板*/
   final void makeSoyaMilk() {

       select();
       addCondiments();
       soak();
       beat();
       otherSteps();
  }

   // 第一步,选择材料
   protected abstract void select();

   // 第二步, 添加配料
   protected abstract void addCondiments();

   // 第三步,侵泡
   private void soak() {
       System.out.println("第三步:将豆和配料浸泡,时间3个小时以上");
  }

   // 打碎
   private void beat() {
       System.out.println("第四步:将豆和配料打碎");
  }

   // 其他步骤
   protected abstract void otherSteps();

}

2、实现不同的子类,实现不同的豆浆制作,如蜂蜜养颜豆浆、红枣枸杞豆浆。重写变化的部分方法,如下

package designPattern.behavioralPattern.TemplateMethodPattern;

/**
* 蜂蜜养颜豆浆
*/
public class HoneyNourishingSoyBeanMilk extends SoyaMilk {

   @Override
   protected void select() {
       System.out.println("第一步:选择新鲜的黄豆、绿豆");
  }

   @Override
   protected void addCondiments() {
       System.out.println("第二步:加入配料:蜂蜜40克");
  }

   @Override
   protected void otherSteps() {
       System.out.println("其他步骤:装入“全营养星”豆浆机网罩内,杯体内注入适量清水,启动机器,十几分钟豆浆做好,稍凉调入蜂蜜搅匀即可");
  }
}
package designPattern.behavioralPattern.TemplateMethodPattern;

/**
* 红枣枸杞豆浆
*/
public class JujubeMedlarSoybeanMilk extends SoyaMilk {

   @Override
   protected void select() {
       System.out.println("第一步:选择新鲜的黄豆");
  }

   @Override
   protected void addCondiments() {
       System.out.println("第二步:加入配料:红枣15克、枸杞10克");
  }

   @Override
   protected void otherSteps() {
       System.out.println("其他步骤:装入“全营养星”豆浆机网罩内1/2~2/3,杯体内加入适量清水,启动机器后十几分钟自动熬熟即可饮用");
  }
}

3、test类,测试效果

package designPattern.behavioralPattern.TemplateMethodPattern;

public class Test {

   public static void main(String[] args) {

       // 制作蜂蜜养颜豆浆
       System.out.println("制作蜂蜜养颜豆浆");
       SoyaMilk honeyNourishingSoyBeanMilk = new HoneyNourishingSoyBeanMilk();
       honeyNourishingSoyBeanMilk.makeSoyaMilk();

       System.out.println("-----------------------------------------------------------------------------------------");

       // 制作红枣枸杞豆浆
       System.out.println("制作红枣枸杞豆浆");
       SoyaMilk jujubeMedlarSoybeanMilk = new JujubeMedlarSoybeanMilk();
       jujubeMedlarSoybeanMilk.makeSoyaMilk();
  }
}

4、运行效果,不同的实现,步骤不同,内容不同,将抽象的可变的留给子类实现以达到不同的效果,如下所示运行结果。


本文来自网络或网友投稿,如有侵犯您的权益,请发邮件至:aisoutu@outlook.com 我们将第一时间删除。

相关素材