`
jy03100000
  • 浏览: 34201 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

设计模式:模板方法模式

 
阅读更多

定义

模板方法模式 定义一个操作中的算法的框架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤

Template Method Pattern Define the skeleton of an algorithm in a operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithm’s structure.

 

优缺点

优点:

  1. 封装不变部分,扩展可变部分
  2. 提取公共部分代码,便于维护
  3. 行为由父类控制,子类实现

缺点:

按照一般设计习惯,抽象类负责声明最抽象、最一般的事物属性和方法,实现类完成具体的事物属性和方法。但模板方法模式却颠倒了,抽象类定义了部分抽象方法,由子类实现,子类执行结构影响父类结果,也就是子类对父类产生了影响,增加代码阅读的难度

 

使用场景

  1. 多个子类有公有方法,并且逻辑基本相同
  2. 重要复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现
  3. 重构时,把相同的代码抽取到父类中,通过钩子函数约束其行为

实现方法

将父类定义为抽象类,叫做抽象模板,在其中定义方法,方法分为2种:

基本方法:由子类实现,并在模板方法中被调用

模板方法:一个或几个,一般是一个具体方法,也就是一个框架,实现对基本方法的调度,完成固定的逻辑

 

具体实现

抽象模板

public abstract class HummerModel {
 
    //基本方法
    protected abstract void start();
 
    protected abstract void stop();
 
    protected abstract void alarm();
 
    protected abstract void engineBoom();
 
    //模板方法,一般都加上final关键字,不允许覆写,防止恶意操作
    final public void run() {
        this.start();
        this.engineBoom();
        if (this.isAlarm()) {
            this.alarm();
        }
        this.stop();
    }
 
    //钩子方法
    protected boolean isAlarm() {
        return true;
    }
}

子类1 覆写父类的钩子方法,反向控制父类运行结果

public class HummerH1Model extends HummerModel {
 
    boolean alarmFlag = true;
 
    @Override
    protected void start() {
        System.out.println("H1 start!");
    }
 
    @Override
    protected void stop() {
        System.out.println("H1 stop!");
    }
 
    @Override
    protected void alarm() {
        System.out.println("H1 alarm!");
    }
 
    @Override
    protected void engineBoom() {
        System.out.println("H1 engineBoom!");
    }
 
    @Override
    protected boolean isAlarm() {
        return this.alarmFlag;
    }
 
    public void setAlarm(boolean isAlarm) {
        this.alarmFlag = isAlarm;
    }
}

子类2:覆写父类钩子方法,指定父类运行结果

public class HummerH2Model extends HummerModel {
 
    @Override
    protected void start() {
        System.out.println("H2 start!");
    }
 
    @Override
    protected void stop() {
        System.out.println("H2 stop!");
    }
 
    @Override
    protected void alarm() {
        System.out.println("H2 alarm!");
    }
 
    @Override
    protected void engineBoom() {
        System.out.println("H2 engineBoom!");
    }
 
    @Override
    protected boolean isAlarm() {
        return false;
    }
}

子类3:不覆写钩子方法,保持父类的运行结果

public class HummerH3Model extends HummerModel {
 
    @Override
    protected void start() {
        System.out.println("H3 start!");
    }
 
    @Override
    protected void stop() {
        System.out.println("H3 stop!");
    }
 
    @Override
    protected void alarm() {
        System.out.println("H3 alarm!");
    }
 
    @Override
    protected void engineBoom() {
        System.out.println("H3 engineBoom!");
    }
}

场景类

public class CLient {
 
    public static void main(String[] args) {
        HummerH1Model h1 = new HummerH1Model();
//        h1.setAlarm(true);
        h1.setAlarm(false);
        h1.run();
        HummerH2Model h2 = new HummerH2Model();
        h2.run();
        HummerH3Model h3 = new HummerH3Model();
        h3.run();
    }
}

参考内容:

《设计模式之禅》秦小波

 

 

分享到:
评论

相关推荐

    设计模式之模板方法模式

    模板方法模式是面向对象设计模式中的行为模式之一,它在Java等面向对象编程语言中有着广泛的应用。模板方法模式的主要思想是在一个抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现。这样,子类可以重写...

    《设计模式:可复用面向对象软件的基础》英文版

    ### 设计模式:可复用面向对象软件的基础 #### 书籍概述 《设计模式:可复用面向对象软件的基础》是一本由Erich Gamma、Richard Helm等四位国际知名的软件工程师共同编写的经典之作,该书提供了面向对象软件设计中...

    设计模式:可复用面向对象软件的基础(非扫描版+高清)

    《设计模式:可复用面向对象软件的基础》是一本经典的软件工程著作,它详细阐述了在面向对象编程中,如何通过使用预定义的解决方案模板来解决常见问题,从而提高代码的可读性、可维护性和复用性。设计模式是经验丰富...

    设计模式:可复用面向对象软件的基础--详细书签版

    设计模式捕获了随时间进化与发展的问题的求解方法,因此它们并不是人们从一开始就采用的设计方案。它们反映了不为人知的重新设计和重新编码的成果,而这些都来自软件开发者为了设计出灵活可复用的软件而长时间进行的...

    《设计模式:可复用面向对象软件的基础》学习并理解 23 种设计模式

    《设计模式:可复用面向对象软件的基础》一书介绍了23种经典的设计模式,这些模式大致可以分为三大类: 1. **创建型模式**:专注于对象的创建机制,确保系统在合适的时机创建正确的对象。 - **单例模式**...

    设计模式-模板方法模式ppt

    ### 设计模式之模板方法模式解析 #### 一、引言 在软件开发过程中,我们经常面临这样的场景:有一些步骤是固定的,而某些步骤则可能因具体实现而异。为了解决这类问题,设计模式中引入了一种叫做“模板方法模式”的...

    设计模式:可复用的面向对象软件的基础

    设计模式是指在面向对象软件开发中,针对特定问题而设计的解决方案模板,它们是经过时间检验的最佳实践,可以帮助开发者构建灵活、易维护且可复用的软件系统。掌握设计模式对游戏引擎的开发尤其重要,因为游戏引擎...

    设计模式--模板方法模式java例子

    模板方法模式是设计模式中行为型模式的一种,它在软件工程中扮演着非常重要的角色,尤其是在Java编程中。模板方法模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。它允许子类不改变一个算法的结构即可重...

    软件设计模式经典案例讲解

    本篇文章将深入探讨几种经典的设计模式:模板方法模式、外观模式、代理模式、装饰器模式、桥模式、工厂方法模式以及组合模式。 首先,模板方法模式(Template Method Pattern)是行为设计模式的一种,它定义了操作...

    设计模式的模板方法模式的例子

    模板方法模式是设计模式中行为模式的一种,它在软件工程中扮演着重要的角色,尤其是在创建算法框架时。这种模式允许我们在抽象类中定义一个算法的骨架,而将一些步骤延迟到子类中实现,使得子类可以不改变算法的结构...

    深入浅出设计模式之模板方法模式

    ### 深入浅出设计模式之模板方法模式 #### 一、模板方法模式概述 设计模式是软件工程中一种非常重要的技术手段,它能够帮助我们解决常见的编程问题,并提高代码的可重用性、可扩展性和可维护性。模板方法模式是一...

    Java设计模式之模板方法模式Java认证考试.pdf

    Java设计模式之模板方法模式Java认证考试 Java设计模式之模板方法模式是Java认证考试中的一种重要的设计模式,它通过使用继承关系来定义一个操作中的算法骨架,而将一些步骤延迟到子类中,使得子类可以不改变一个...

    设计模式:可复用面向对象软件设计基础(附源码)

    设计模式是软件工程中的一种重要概念,它代表了在特定情境下解决常见问题的最佳实践。这些模式通过前人的经验总结,为开发人员提供了一种标准化的解决方案,使得代码更易于理解、扩展和维护。本资源《设计模式:可...

    策略模式结合模板方法模式

    策略模式结合模板方法模式的设计思路 策略模式结合模板方法模式是策略模式的一种变形,目的是为了解决策略模式中的一些共性问题。在策略模式中,经常会出现这样一种情况,就是发现这一系列算法的实现上存在公共功能...

    Head First 设计模式 (八) 模板方法模式(Template Method pattern) C++实现

    模板方法模式是设计模式中的一种行为模式,它在软件工程中扮演着重要的角色,尤其是在C++这样的面向对象编程语言中。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的...

    设计模式:简单工厂、方法工厂、抽象工厂、单例、原型、委派、模板、代理、策略

    7. **模板方法**:模板方法模式是一种行为设计模式,定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 8. **代理**:代理模式为其他对象提供...

    java 23种设计模式.zip

    设计模式主要分为三大类: 1.创建型模式:工厂模式、抽象...4.行为型模式:模板方法模式、命令模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式、状态模式、策略模式、职责链模式、访问者模式。

Global site tag (gtag.js) - Google Analytics