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(转载请说明出处)

  • 相关阅读:
    致命错误 RC1121: RC : fatal error RC1121 : I/O error reading file
    Windows 右键 添加 “使用CMD打开”
    C2061: syntax error : identifier 'THIS_FILE'
    delphi 产生随机数
    使用Code::Blocks编译VC程序
    Delphi中用来截取字符的函数,以及使用方法
    VC6.0 最新的 SDK platform sdk xpsp2 官方下载地址
    ubuntu下codeblocks起步
    VC中Error spawning cl.exe错误的解决方法
    Delphi如何获取时间月份
  • 原文地址:https://www.cnblogs.com/telwanggs/p/6781610.html
Copyright © 2011-2022 走看看