zoukankan      html  css  js  c++  java
  • Java设计模式之模板方法模式(Template Method)

    本文继续介绍23种设计模式系列之模板方法模式。

    概述
    模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。
    比如定义一个操作中的算法的骨架,将步骤延迟到子类中。模板方法使得子类能够不去改变一个算法的结构即可重定义算法的某些特定步骤。
     
    模式中的角色
    抽象类(AbstractClass):实现了模板方法,定义了算法的骨架。
    具体类(ConcreteClass):实现抽象类中的抽象方法,已完成完整的算法。
     
    应用
    举个例子,以准备去学校所要做的工作(prepareGotoSchool)为例,假设需要分三步:穿衣服(dressUp),吃早饭(eatBreakfast),带上东西(takeThings)。学生和老师要做得具体事情肯定有所区别。
    抽象类AbstractClass
    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public abstract class AbstractPerson{  
    2.      //抽象类定义整个流程骨架  
    3.      public void prepareGotoSchool(){  
    4.           dressUp();  
    5.           eatBreakfast();  
    6.           takeThings();  
    7.      }  
    8.      //以下是不同子类根据自身特性完成的具体步骤  
    9.      protected abstract void dressUp();  
    10.      protected abstract void eatBreakfast();  
    11.      protected abstract void takeThings();  
    12. }  
    具体类ConcreteClass
    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class Student extends AbstractPerson{  
    2.      @Override  
    3.      protected void dressUp() {  
    4.           System.out.println(“穿校服");  
    5.      }  
    6.      @Override  
    7.      protected void eatBreakfast() {  
    8.           System.out.println(“吃妈妈做好的早饭");  
    9.      }  
    10.   
    11.      @Override  
    12.      protected void takeThings() {  
    13.           System.out.println(“背书包,带上家庭作业和红领巾");  
    14.      }  
    15. }  
    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class Teacher extends AbstractPerson{  
    2.      @Override  
    3.      protected void dressUp() {  
    4.           System.out.println(“穿工作服");  
    5.      }  
    6.      @Override  
    7.      protected void eatBreakfast() {  
    8.           System.out.println(“做早饭,照顾孩子吃早饭");  
    9.      }  
    10.   
    11.      @Override  
    12.      protected void takeThings() {  
    13.           System.out.println(“带上昨晚准备的考卷");  
    14.      }  
    15. }  
    [java] view plain copy
     
     print?在CODE上查看代码片派生到我的代码片
    1. public class Client {  
    2.      public static void main(String[] args) {  
    3.      Student student = new Student()  
    4.      student.prepareGotoSchool();  
    5.   
    6.      Teacher teacher  = new Teacher()  
    7.      teacher.prepareGotoSchool();  
    8.      }  
    9. }  
     
    优点
    模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
    子类实现算法的某些细节,有助于算法的扩展。
    通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
     
    缺点
    每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
     
    适用场景
    在某些类的算法中,用了相同的方法,造成代码的重复。
    控制子类扩展,子类必须遵守算法规则。
    更多设计模式:23种设计模式系列
     

    作者:jason0539

    博客:http://blog.csdn.net/jason0539(转载请说明出处)

  • 相关阅读:
    Android 开发学习进程0.19 webview 的使用
    2020年4到6月—7家公司面试总结(3家已拿offer)
    iOS今日头条第3轮面试回忆
    [搬运]Dart之枚举中使用扩展
    Proguard 常用规则
    shiro安全框架
    Android服务的AIDL跨进程(程序)操作
    Android——服务的实例,银行服务
    Android四大组件之服务————服务的生命周期和启动方式
    Android 程序间的广播和Manifest找不到(解决方法)
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6781610.html
Copyright © 2011-2022 走看看