java设计模式(模板方法模式)

模板方法模式

  定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。 模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。通俗的说的就是有很多相同的步骤的,在某一些地方可能有一些差别适合于这种模式,例如想要泡一杯茶或者一杯咖啡,第一步都是将水煮沸,第二部是加入咖啡或者茶,第三部就是将饮料倒入杯子中,第四部就是加入各种调味料。其中第一步和第三部都是一样的,这个就可以定义在基类,而第二步和第四步就是他们之间的差异就可以在具体的子类中去实现。下面就是代码实现。

定义抽象基类,为所有子类提供一个算法框架

public abstract class RereshBaverage {
    /**
     * 制备饮料的模板方法
     * 封装了所有子类共同遵守的算法骨架
     */
    public final void prepreBvergeTemplage(){
        //步骤一 将水煮沸
        boilWater();
        //步骤二 炮制饮料
        brew();
        //步骤三 将饮料倒入杯中
        pourInCup();
        //步骤四 加入调味料
        addCondiments();

    }

    /**
     * 基本方法,将水煮沸 这对所有子类而言是一个共同的行为,所以声明为private,无需向子类开放
     */
    private void boilWater(){
        System.out.println("将水煮沸");
    }

    /**
     * 抽象的基本方法 泡制饮料
     * 在算法框架中并不知道具体实现是什么样子的,所以做成了抽象方法,并且由于我们需要在子类中可见,便于复写而提供具体的实现所以将
     * 权限设置为protected
     */
    protected abstract void brew();

    private void pourInCup(){
        System.out.println("将饮料倒入杯中");
    }

    /**
     * 加入调味料
     */
    protected abstract void addCondiments();

}

具体子类,提供了咖啡制备的具体实现

public class Coffee extends RereshBaverage {
    @Override
    protected void brew() {
        System.out.println("用沸水冲泡咖啡");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入糖和牛奶");
    }
}

具体子类,提供了制备茶的具体实现

public class Tea extends RereshBaverage {
    @Override
    protected void brew() {
        System.out.println("用80 度的热水浸泡茶叶5分钟");
    }

    @Override
    protected void addCondiments() {
        System.out.println("加入柠檬");
    }
}

测试类

public class RereshBaverageTest {
    public static void main(String[] args) {
        System.out.println("咖啡制备中。。。");
        RereshBaverage coffee = new Coffee();
        coffee.prepreBvergeTemplage();
        System.out.println("咖啡制备完成! ");

        System.out.println("\n*********************");
        System.out.println("茶制备中。。。");
        RereshBaverage tea = new Tea();
        tea.prepreBvergeTemplage();
        System.out.println("茶制备完成!");
    }

}

运行结果:

如果我们希望喝到一杯black coffee或者喝到一杯纯正的茶,就是不希望实现第四个步骤,那么将如何实现呢,如何做到个性化的扩展呢,这里就用到了一个钩子方法。

改造基类方法,添加钩子函数,如图所示

子类茶重写父类方法,实现挂载钩子,如图所示

测试和结果

茶的实现就少了加入柠檬的步骤。这就是钩子函数的作用,他为我们在子类中提供了和更加的灵活性与选择性决定算法的具体实现。

总结:

模板方法模式的实现要素:1.抽象基类 2.具体子类。在抽象基类中要提供一些具体的基本方法,对于各种不同的实现子类而言是相同的,具有共性的。还有一些抽象方法,是对于那些我们只知道具体原则,而不知道实现细节,需要将她延迟到子类实现的一些步骤。还有一些我们可选的钩子函数。最后我们将基本方法,抽象方法和钩子函数按照我们业务逻辑的需求汇总成一个模板方法,这就构成了我们的算法框架,模板方法必须声明成final,不能被子类所复写。

具体子类:1.实现基类中的抽象方法 2.覆盖钩子方法。

模板方法模式的适用场景:

(1)算法或操作遵循相似的逻辑

(2)重构时(把相同的代码提取到父类中)

(3)重要复杂的算法,核心算法设计为模板方法

模板方法模式的优点:1.封装性好 2.复用性好 3.屏蔽细节 4.便于维护

模板方法模式的缺点:继承 java是一个单继承的语言,设想在一个已有的系统当中大量的使用到了继承,这个时候如果我们想要做一些重构,通过模板方法的模式抽取共性,因为我们的类已经出一个继承层次的某个结构之中,再通过模板方法引入新的继承的时候就会遇到困难。

原文地址:https://www.cnblogs.com/xiayq/p/10591562.html

时间: 2024-11-05 17:22:37

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

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

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

JAVA 设计模式 模板方法模式

定义 模板方法模式(Template Method) 定义了一个操作中的算法的骨架,而将部分步骤的实现在子类中完成. 模板方法模式使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. 模板方法模式是所有模式中最为常见的几个模式之一,是基于继承的代码复用的基本技术. 因此,在模板方法模式的类结构图中,只有继承关系,没有关联关系. 模板方法模式需要开发抽象类和具体子类的设计师之间的协作.一个设计师负责给出一个算法的轮廓和骨架,另一些设计师则负责给出这个算法的各个逻辑步骤. 代表这些具体逻

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

定义: 模板模式是一种行为设计模式,使用了JAVA的继承机制,在抽象类中定义一个模板方法,该方法引用了若干个抽象方法(由子类实现)或具体方法(子类可以覆盖重写).它的实现思路是,创建一个桩方法,并且定义一些步骤让子类来实现.模板方法定义了一个算法的执行步骤,或者说能够提供一种默认的实现,这种实现概括一部分子类或者全部子类的共同部分. 举一个例子帮助理解,假设提供一种造房子的算法.算法的步骤就是模拟造房子的过程:建地基.建支撑,最后添加墙和窗户 – 1. Fundation,2. Pillars,

设计模式 - 模板方法模式(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) 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) 排序(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 设计模式 -- 复合模式之二

接着上文的鸭鸣例子:Java 设计模式 -- 复合模式之一 上文中,我们的鸭鸣实现了 装饰者模式  适配器模式  工厂模式的结合 现在,又需要进行改动了,上文,是可以统计一群鸭子的叫声,现在需要能够观察个别鸭子的行为 引入观察者模式: 任何想被观察的Quackable都必须实现下面的接口 public interface QuackObservable { public void registerObserver(Observer observer); public void notifyobs

一起学java设计模式--代理模式(结构型模式)

代理模式 应用软件所提供的桌面快捷方式是快速启动应用程序的代理,桌面快捷方式一般使用一张小图片来表示(Picture),通过调用快捷方式的run()方法将调用应用软件(Application)的run()方法.使用代理模式模拟该过程,绘制类图并编程实现. package ProxyPattern; interface Software { void run(); } class Application implements Software { public void run() { Syste