`

《设计模式》之五:模板方法模式

阅读更多

模板方法模式 Template Method Pattern 定义如下:

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

先定义抽象模板类:

/**
 * 抽象模板类
 * 为了防止恶心操作,模板方法都会加上final关键字,不允许覆盖
 *
 * @author XiongNeng
 * @version 1.0
 * @since 13-5-22
 */
public abstract class AbstractTemplate {
    // 基本方法
    protected abstract void doSomething();
    // 基本方法
    protected abstract void doAnything();
    // 模板方法
    public final void templateMethod() {
        // 调用基本方法,完成相关的业务逻辑
        this.doSomething();
        this.doAnything();
    }
}

 然后是实现类:

public class ConcreteClass1 extends AbstractTemplate {
    @Override
    protected void doSomething() {
        System.out.println("class1 doSomething...");
    }

    @Override
    protected void doAnything() {
        System.out.println("class1 doAnything...");
    }
}

 

public class ConcreteClass2 extends AbstractTemplate {
    @Override
    protected void doSomething() {
        System.out.println("class2 doSomething...");
    }

    @Override
    protected void doAnything() {
        System.out.println("class2 doAnything...");
    }
}

 

注意:

抽象模板中的基本方法尽量设计为protected,符合迪米特法则,不需要暴露的属性或方法尽量不要设置为protected,更不要设置为public。实现类若非必要,尽量不要扩大父类中的访问权限。

 

模板方法的优点:

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

2,提取公共部分代码,便于维护

3,抽象父类负责控制行为,而具体子类负责实现行为,相当于一个司令负责调度下面的部署作战方案,具体怎样去执行这个命令达到目的(到底是夜袭还是埋伏还是奇袭),就是下属决定的了。

 

模板方法的缺点:

抽象类定义了部分抽象方法,由子类实现,子类执行结果影响了父类结果,也就是子类对父类产生了影响,这在负责项目中,会给代码阅读带来一定的难度,让新手感到不适。

 

模板方法使用场景:

1,多个子类有公有方法,并且逻辑基本相同

2,重要、负责的算法,可以把核心算法设计为模板方法,周边的相关细节功能由子类实现

3,重构时候,模板方法是一个经常使用的模式,把相同代码抽取到父类中,然后通过钩子函数(见 模板方法模式的扩展)约束其行为

 

模板方法的扩展:

public abstract class AbstractTemplate {
    // 基本方法
    protected abstract void doSomething();
    // 基本方法
    protected abstract void doAnything();
    // 模板方法
    public final void templateMethod() {
        // 调用基本方法,完成相关的业务逻辑
        this.doSomething();
        this.doAnything();
        if (hookFlag()) {
            System.out.println("----Oh yes, hookFlag...");
        } else {
            System.out.println("----Oh no, hookFlag...");
        }
    }

    // 钩子方法
    protected abstract boolean hookFlag();
}

 

public class ConcreteClass1 extends AbstractTemplate {
    private boolean hookFlag;
    @Override
    protected void doSomething() {
        System.out.println("class1 doSomething...");
    }

    @Override
    protected void doAnything() {
        System.out.println("class1 doAnything...");
    }

    @Override
    protected boolean hookFlag() {
        return hookFlag;
    }

    public void setHookFlag(boolean hookFlag) {
        this.hookFlag = hookFlag;
    }
}

 外界条件的改变可以影响到模板方法的执行。我们抽象类中hookFlag()方法返回值影响了模板方法执行结果,该方法叫钩子方法。有了钩子方法模板方法才算完美。

 

最佳实践:

父类建立框架,子类在重写了父类部分的方法后,再调用从父类继承的方法,也就是模板方法,产生不同的结果,而这正是模板方法模式。这也可以理解为父类调用了子类的方法,你修改了子类,影响了父类的行为,曲线救国的方式实现了父类依赖子类的场景,模板方法就是这种效果。

 

模板方法在一些开源框架中应用非常多,它提供了一个抽象类,然后开源框架写了一堆子类。

如果你需要扩展功能,可以继承这个抽象类,然后覆写protected方法,在然后就是调用一个类似于execute的模板方法,就完成了你的扩展开放,非常容易扩展的一种模式。

 

本人博客已搬家,新地址为:http://yidao620c.github.io/

分享到:
评论

相关推荐

    设计模式之模板方法模式

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

    Python中的设计模式之光:模板方法模式的妙用

    Python的设计哲学强调代码的可读性和简洁的语法(尤其是使用空格缩进来区分代码块,而不是使用大括号或关键词)。这使得Python被认为是一种易于学习的语言,同时具备强大的功能,适合初学者和经验丰富的程序员。 ...

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

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

    设计模式的杰作:深入设计模式

    《深入设计模式》详细阐述了这五个原则: - **S: 单一职责原则(Single Responsibility Principle, SRP)**:一个类应该只有一个引起它变化的原因。 - **O: 开闭原则(Open/Closed Principle, OCP)**:软件实体应该是...

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

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

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

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

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

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

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

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

    设计模式C++学习之模板方法模式(Template Method)

    模板方法模式(Template Method)是设计模式中行为型模式的一种,它定义了操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。这个模式在C++编程中有着...

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

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

    Java设计模式之模板方法模式.rar

    模板方法模式是面向对象设计模式中的行为模式之一,它在Java编程中有着广泛的应用。这种模式定义了一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定...

    设计模式(十一)之模板方法模式.zip

    模板方法模式是面向对象设计中的一种行为设计模式,它在软件工程中扮演着重要的角色,尤其是在需要维护代码的可扩展性和可复用性时。这个模式的核心思想是封装不变的部分,将可变部分抽象出来,让子类进行扩展。通过...

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

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

    设计模式之模板设计模式

    模板设计模式是面向对象设计模式的一种,它在软件工程中扮演着重要的角色,尤其是在构建可扩展和可维护的代码库时。这个模式属于行为设计模式,主要用来在父类中定义一个操作流程的骨架,而将具体实现细节留给子类去...

    Java 经典设计模式讲解以及项目实战

    Java 经典设计模式讲解以及项目实战 设计模式简介:主要介绍各种设计模式的概念和运用场景等 设计模式综合运用:主要是笔者在实际工作中运用到的一些设计模式综合运用事例的提炼 Spring设计模式简介:主要是讲述...

    23种设计模式详解PDF

    设计模式 的分类 总体来说设计模式分为三大类: 创建型模式(5): 工厂方法模式 、抽象工厂模式、单例模式、建造者模式、原型模式。 结构型模式(7): 适配器模式、装饰器模式、代理模式、外观模式、桥接模式、...

    设计模式之模板方法(Template)

    模板方法设计模式是一种行为设计模式,它...模板方法设计模式是设计模式中的基础模式之一,理解并正确使用它可以提高软件的灵活性、可维护性和扩展性。在实际开发中,我们应该根据需求灵活运用,以达到最佳的设计效果。

    设计模式之简单模板模式(附demo)

    **模板模式(Template Pattern)**是一种行为设计模式,它使你能在抽象类中定义操作算法的框架,而将一些步骤延迟到子类中。这样,子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。 在Java、C#等面向...

Global site tag (gtag.js) - Google Analytics