设计模式-模板方法模式(15)

行为型模式(Behavioral Pattern)是对不同的对象之间划分责任和算法的抽象化。行为型模式包括11种模式:模板方法模式、命令模式、责任链模式、策略模式、迭代器模式、中介者模式、观察者模式、备忘录模式、访问者模式、状态模式、解释器模式。

定义

 模板方法模式(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.

 翻译:定义一个操作中的算法框架,将一些步骤延迟到子类中,使得子类可以在不改变算法结构的前提下即可重新定义该算法的某些特定步骤。

角色:

 抽象模板(Abstract Template)角色:该角色定义一个或多个抽象操作,以便让子类实现。这些抽象操作是基本操作,是一个顶级逻辑的组成步骤。还需要定义并实现一个或几个模板方法,这些模板方法一般是具体方法,即一个框架,实现对基本方法的调度,完成固定的逻辑。

 具体模板(Concrete Template)角色:该角色实现抽象模板中定义的一个或多个抽象方法,每一个抽象模板角色都可以有任意多个具体模板角色与之对应,而每一个具体模板角色都可以给出这些抽象方法的不同实现,从而使得顶级逻辑的实现各不相同。

/**
 * 抽象模板角色
 */
public abstract class AbstractClass {
    //基本方法
    protected abstract void operation();
    //基本方法2
    protected abstract void operation2();

    //模板方法
    public void templateMethod(){
        //调用基本方法,完成相关逻辑
        this.operation();
        this.operation2();
    }

}

/**
 * 具体模板角色
 */
public class ConcreteClass extends AbstractClass{
    //实现基本业务方法
    @Override
    protected void operation() {
        //业务逻辑
        System.out.println("具体类的操作");
    }

    @Override
    protected void operation2() {
        //业务逻辑
        System.out.println("具体类的操作2");
    }
}

public class Client {
    public static void main(String[] args) {
        AbstractClass ac = new ConcreteClass();
        //调用模板方法
        ac.templateMethod();
    }
}

源码

模板方法调用基本方法后结果如下:

优点

 封装不变的部分,扩展可变的部分。将不变的部分封装到父类中实现,而可变的部分则可以通过继承进行扩展。

 提取公共部分代码,便于维护。将公共部分的代码抽取出来放在父类中,维护时只需修改父类中的代码。

 行为由父类控制,子类实现。模板方法模式中的基本方法是由子类实现的,因此子类可以通过扩展增加相应的功能,符合开闭原则。

应用场景

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

 可以把重要的、复杂的核心算法设计为模板方法,周边的相关细节功能则由各个子类实现。

 重构时,模板方法模式是一种经常使用的模式,将相同的代码抽取出来放到父类中。

计算银行利息Demo

/**
 * 抽象模板,抽象账户类
 */
public abstract class Account {
    //账号
    private String accountNumber;

    //构造函数
    public Account(){
        accountNumber = null;
    }
    public Account(String accountNumber) {
        this.accountNumber = accountNumber;
    }

    /**
     * 基本方法,确定账户类型,留给子类实现
     * @return
     */
    protected abstract String getAccountType();

    /**
     * 基本方法,确定利息,留给子类实现
     * @return
     */
    protected abstract double getInterestRate();

    /**
     * 基本方法,根据账户类型和账户确定账户金额
     * @param accountType
     * @param accountNumber
     * @return
     */
    public double calculateAmount(String accountType,String accountNumber){
        //访问数据库...此处直接返回账户金额
        return 10000.00D;
    }

    //模板方法,计算账户利息
    public double calculateInterest(){
        String accountType = getAccountType();
        double interestRate = getInterestRate();
        double amount = calculateAmount(accountType,accountNumber);
        return amount*interestRate;
    }

}

/**
 * 具体模板类,活期账户
 */
public class DemandAccount extends Account {

    @Override
    protected String getAccountType() {
        return "活期";
    }

    @Override
    protected double getInterestRate() {
        return 0.003D;
    }

}

/**
 * 具体模板类,定期账户
 */
public class FixedAccount extends Account {

    /**
     * 基本方法,确定账户类型
     * @return
     */
    protected String getAccountType() {
        return "一年定期";
    }

    /**
     * 基本方法,确定利息
     * @return
     */
    protected double getInterestRate() {
        return 0.04D;
    }
}

/**
 * 测试类
 */
public class ClientAccount {
    public static void main(String[] args) {
        Account account = new DemandAccount();
        System.out.println("活期账户利息:"+account.calculateInterest());
        account = new FixedAccount();
        System.out.println("一年定期账户利息:"+account.calculateInterest());
    }
}

源码

运行结果:

原文地址:https://www.cnblogs.com/aeolian/p/8872293.html

时间: 2024-08-11 18:45:17

设计模式-模板方法模式(15)的相关文章

设计模式 - 模板方法模式(template method pattern) Applet 详解

模板方法模式(template method pattern) Applet 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), applet就是一个能够在网页上面执行的小程序, applet有很多钩子(

设计模式 - 模板方法模式(template method pattern) JFrame 详解

模板方法模式(template method pattern) JFrame 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式(template method pattern), Java的JFrame使用模板方法模式, paint()是可以覆盖的方法,

设计模式 - 模板方法模式(template method pattern) 排序(sort) 详解

模板方法模式(template method pattern) 排序(sort) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考模板方法模式(template method pattern): http://blog.csdn.net/caroline_wendy/article/details/32159455 模板方法模式的一个主要的应用是排序(sort)算法. 对象的排列方式并不是完全相同, 所以需要排序(sort)算法compareTo()

设计模式 - 模板方法模式(template method pattern) 详解

模板方法模式(template method pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 模板方法模式(template method pattern): 在一个方法中定义一个算法的骨架, 而将一些步骤延迟到子类中. 模板方法使得子类可以在不改变算法结构的情况下, 重新定义算法中的某些步骤. 模板方法可以进行挂钩(hook), 钩子(hook)是一种被声明在抽象类中的方法, 但只有空的或者默认的实现. 钩子的存在, 可以让子类有能力

结合JDK源码看设计模式——模板方法模式

前言: 相信很多人都听过一个问题:把大象关进冰箱门,需要几步? 第一,把冰箱门打开:第二,把大象放进去:第三,把冰箱门关上.我们可以看见,这个问题的答案回答的很有步骤.接下来我们介绍一种设计模式--模板方法模式,你会发现,它与这个问题的答案实际上有很多共同之处. 一.定义 定义一个算法骨架,允许子类为一个或多个步骤提供实现.模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤. 二.适用场景 一次性实现一个算法的不变的部分,将可变的行为留给子类实现 也就是将各子类中公共行为被提取

java设计模式 模板方法模式Template Method

设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性.毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因.

设计模式-模板方法模式(the Template Method Pattern)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 模板方法模式简介 这是一个被用的相当广泛的一种设计模式,变体也特别多,他建立一个抽象类定义一个算法的结构,但是把细节部分的实现权力交个子类实现,是一种很灵活且代码重用性很高的设计模式. 模板方法模式的定义和基本结构 定义:在一个方法中定义一个算法的骨架,而将其中一些步骤的实现交给子类,模板方法模式使得子类在不改变算法结构的情况下,重新定义了算法中的某些步骤. 一张来自<Head First>

大话设计模式—模板方法模式

在模板方法模式(TemplateMethod Pattern)中,一个抽象类公开定义了执行它的方法的方式/模板.它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行.这种类型的设计模式属于行为型模式. 大话设计模式中程杰老师给出的定义是:模板方法模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 有一个经常用到的实例就是Spirng 中对 Hibernate 的支持,将一些已经定好的方法封装起来,比如开

设计模式—模板方法模式

模板方法模式的英文:Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method let subclasses redefine certain steps of an algorithm without changing the algorithm`s structure. 意思是:定义一个操作中的算法的框架,而将一些步骤延迟到子类中去.使得子类不