文档章节

设计模式之模板方法

不正经啊不正经
 不正经啊不正经
发布于 2015/02/06 17:02
字数 799
阅读 25
收藏 1

一、定义

在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤.

二、核心思想

1、这个模式是用来创建一个算法的模板

2、模板方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现

3、确保算法的结构保持不变,同时由子类提供部分实现

三、相关设计原则

好莱坞原则

1、别调用(打电话给)我们,我们会调用(打电话给)你

2、用于防止依赖腐败

3、要不要用你,高层组件说了算

4、好莱坞原则让底层组件被挂钩进计算中,而又不会让高层组件依赖底层组件 

钩子

1、钩子是一种被声明在抽象类中的方法,但只有空的或者默认的实现。钩子的存在可以让子类有能力对算法的不同点进行钩挂

2、有了钩子,我们可以让模板方法中的程序决定是否调用模板方法中的某些方法


四、使用场景

1、茶和咖啡的冲泡方式

茶:(1)把谁煮沸(2)用沸水冲泡咖啡(3)把咖啡倒进杯子(4)加糖和牛奶

咖啡:(1)把谁煮沸(2)用沸水浸泡茶叶(3)把茶倒进杯子(4)加柠檬

2、观察场景

两种冲泡方式有相同的地方,也有不同的地方


五、代码实现

package com.fengshu.limanman;
 
/**
 * 
 * 1、理解模板方法 2、理解好莱坞原则 3、理解钩子的用法
 * 
 * @author 李慢慢
 *
 */
public class Temple {
    public static void main(String[] args) {
        CaffeineBeverage caffeineBeverage = new Coffee();
        caffeineBeverage.pripareRecipe();
    }
}
 
/**
 * 制作咖啡因饮料的模板方法
 *
 */
abstract class CaffeineBeverage {
 
    /**
     * final 确保算法的结构保持不变,也体现了好莱坞设计原则,让子类没办法直接调用父类(高层组件方法),只能由高层组件来调用子类实现的方法
     */
    final void pripareRecipe() {
        boilWater();
        brew();
        pourInCup();
        // 钩子决定子类是否执行模板中的某些方法
        if (needCondiments()) {
            addCondiments();
        }
    }
 
    /**
     * 模板方法将算法定义成一组步骤,其中的任何步骤都可以是抽象的,由子类负责实现
     */
    abstract void brew();
 
    /**
     * 模板方法将一部分的实现延迟到了子类中
     */
    abstract void addCondiments();
 
    void boilWater() {
        System.out.println("Boiling water");
    }
 
    void pourInCup() {
        System.out.println("Pouring into cup");
    }
 
    /**
     * 使用了钩子默认true,由子类决定是否进行覆盖
     * 
     * @return
     */
    boolean needCondiments() {
        return true;
    }
}
 
class Coffee extends CaffeineBeverage {
 
    /**
     * 模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤
     *
     */
    @Override
    void boilWater() {
        System.out.println("Boiling water  long long");
    }
 
    @Override
    void brew() {
        System.out.println("Dripping coffee through filter");
    }
 
    @Override
    void addCondiments() {
        System.out.println("Adding Sugar and Milk");
    }
 
    /**
     * 有了钩子,我能够决定要不要覆盖方法。如果我不提供在自己 的方法,抽象类会提供一个默认的实现
     */
    @Override
    boolean needCondiments() {
        return false;
    }
 
}
 
class Tea extends CaffeineBeverage {
 
    @Override
    void brew() {
        System.out.println("steeping the tea");
    }
 
    @Override
    void addCondiments() {
        System.out.println("Adding lemon");
    }
}


© 著作权归作者所有

共有 人打赏支持
不正经啊不正经
粉丝 54
博文 175
码字总数 133499
作品 0
宁波
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
05/18
0
0
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
0
0
代理模式(Proxy Pattern):动态代理 - 最易懂的设计模式解析

前言 今天我来全面总结开发中最常用的设计模式 - 代理模式中的动态代理模式 其他设计模式介绍 1分钟全面了解“设计模式” 单例模式(Singleton) - 最易懂的设计模式解析 简单工厂模式(Sim...

Carson_Ho
04/09
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
06/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS开发用到的图片尺寸汇总

启动图 型号 竖屏 横屏 iPhone SE 640px × 1136px 1136px × 640px iPhone 6s 750px × 1334px 1334px × 750px iPhone 6s Plus 1242px × 2208px 2208px × 1242px iPhone 7 750px × 1334......

业界小白
14分钟前
0
0
浅谈redis

redis是一个开源,内存式的健值存储数据库,也被称为健值存储的字典服务器。健值类型有字符串,hash(哈希类型),set(集合),list(列表) 和有序集合 特征细节: 内存式:redis将健值存储在主...

拐美人
22分钟前
0
0
无限扩容,按需使用!ZStack推出基于阿里云NAS的文件存储服务

日前,ZStack发布2.6.0版本,正式宣布推出基于阿里云NAS的文件存储服务。得益于业界领先的阿里云分布式存储架构,融合NAS后的ZStack 2.6.0拥有高性能、高可靠、容量无限扩展、一键操作、按需...

ZStack社区版
24分钟前
1
0
崛起于Springboot2.X之Mongodb多数据源处理(35)

多数据源:4个mongodb库! 目录结构图: 1、添加pom依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>......

木九天
30分钟前
0
0
如何获取显示器的EDID信息

Q1: 为什么要写这篇文章? A1:在最近的工作中遇到了不少问题,其中很多都是和EDID相关的。可以说,作为一家以“显示”为生的企业,我们时时刻刻在与EDID打交道。EDID这东西很简单,但是如果...

DB_Terrill
30分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部