文档章节

五、设计模式——模板模式

文森特梵高
 文森特梵高
发布于 2015/08/14 09:47
字数 968
阅读 48
收藏 1
点赞 0
评论 0

如何泡咖啡和泡茶?

思考,变化与不变?

很显然,变化的是咖啡喝茶,而泡的步骤没有改变。

第一个层次的抽象,就是讲公共的步骤放在超类中,比如“水烧开”、“倒入杯子”

public abstract class HotDrink {
	public abstract void prepareRecipe();
	public void boilWater() {
		System.out.println("Boiling water");
	}
	public void pourInCup() {
		System.out.println("Pouring into cup");
	}
}


我们发现,除了上述两个步骤一样之外,“冲泡”和“加入材料”这两个动作本质也是一样的。

因此我们总结出第二个层次的抽象。

public abstract class HotDrink {
	public final void prepareRecipe() {//因为步骤也是一样的,所以固定化
		boilWater();
		brew();
		pourInCup();
		addCondiments();
	}
	public abstract void brew();//因为冲泡和加的辅料不同,因此抽象
	public abstract void addCondiments();
	public final void boilWater() {//完全一样的,直接在超类中实现
		System.out.println("Boiling water");
	}
	public final void pourInCup() {
		System.out.println("Pouring into cup");
	}
}

public class Coffee extends HotDrink {

	@Override
	public void brew() {
		System.out.println("Brewing Coffee");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding sugar and milk");
	}

}


模板模式:

封装了一个算法步骤,允许之类为一个或多个步骤提供实现。模板模式允许之类在不改变算法结构的情况下,重新定义算法的某些步骤。



通过hook增加模板方法的实用性


思考,上述中的算法步骤都写死了,那么不就对扩展不利吗?假设某些步骤在某些情况下可以不执行,如何实现?

针对这个问题,其实模板模式提供了钩子的概念,之类可以通过钩子来影响模板方法中的某些步骤,达到灵活执行的目的。

public abstract class HotDrink {

	public final void prepareRecipe() {
		boilWater();
		brew();
		pourInCup();
		if (wantCondimentsHook())
			addCondiments();
		else
			System.out.println("No need to add condiments");
	}
	
	public abstract void brew();
	
	public abstract void addCondiments();
	
	public boolean wantCondimentsHook() {
		return true;
	}
	
	public final void boilWater() {
		System.out.println("Boiling water");
	}
	
	public final void pourInCup() {
		System.out.println("Pouring into cup");
	}
}

public class Coffee extends HotDrink {

	@Override
	public void brew() {
		System.out.println("Brewing Coffee");
	}

	@Override
	public void addCondiments() {
		System.out.println("Adding sugar and milk");
	}

	@Override
	public boolean wantCondimentsHook() {
		return false;
	}
}




身边的模板模式


Array.sort()方法就是一个模板模式的运用,不同是Java将抽象方法移动到对象上。对象需要实现Comparable接口。

public abstract class SortTemplate {

	public final void sort(Object[] objects) {
		for (int i = 0; i < objects.length - 1; i++) {
			if (compare(objects[i+1]) > 0) {
				//swap();
			} else {
				
			}
		}
	}
	
	public abstract int compare(Object object);
}


Android中的组件,BaseAdapter其实也是模板模式。

public class MyAdapter extends BaseAdapter {
    public MyAdapter(Context ctx) {
        this.ctx = ctx;
    }
    //...略...
    @Override
    public int getCount() {
        return data.length;
    }
    @Override
    public int Object getItem(int arg0) {
        return data.get(arg0);
    }
    @Override
    public View getView(int position , int convertView , ViewGroup arg2) {
        //...略...
        return view;
    }
    //...略...
}

上述提供的函数,都是模板方法的步骤调用的。因此来获知空间的元素数量,在显示的时候会调用getView函数。


Activity的生命周期,onStart()、onCreate()、onStop()、onDestroy()等函数,也是模板方法模式的应用。



好莱坞原则


好莱坞原则:别调用我们,我们调用你。

好莱坞原则就是经纪人和明星之间的关系,经纪人负责安排明星的时间表,明星只需要根据经纪人的安排把活动做好,把歌长号,参加粉丝见面会,等等就好了。

在系统中,有一个专门的部分负责流程,而其他部分只需要将流程中的各个步骤做好即可,这样可以很好的解耦,模块之间西相互独立。



模板模式和策略模式 的 差异


模板模式是对流程和步骤的封装,而且是通过继承的方式实现。

策略模式是在超类中将动作进行抽象,通过让不同的方法族能够相互替代,通过组合的方式实现。

策略模式可以与模板模式结合使用,结合点在于模板模式的abstract方法改成引用接口,之类通过传入不同的接口实例达到解耦的目的。

© 著作权归作者所有

共有 人打赏支持
文森特梵高
粉丝 2
博文 28
码字总数 15386
作品 0
广州
程序员
Java 设计模式(14) —— 复合模式

一、复合模式 模式常一起使用,组合在一个设计解决方案中 复合模式在一个解决方案中结合两个或多个模式,能解决一般性或一系列的问题 二、示例 本次设计模式讲解中无代码示例,由于复合模式是...

磊_lei
05/26
0
0
设计模式15——Template Method设计模式

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

小米米儿小
2014/01/24
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0
C#设计模式(2)——简单工厂模式

一、引言   这个系列也是自己对设计模式的一些学习笔记,希望对一些初学设计模式的人有所帮助的,在上一个专题中介绍了单例模式,在这个专题中继续为大家介绍一个比较容易理解的模式——简单工...

技术小胖子
2017/11/08
0
0
【设计模式笔记】(十六)- 代理模式

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

MrTrying
06/24
0
0
JavaScript 中常见设计模式整理

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

牧云云
05/18
0
0
迈向大牛的重要一步——掌握设计模式

IT职场的小菜经常有这样的疑问: 为什么一个相似的功能,大牛一会儿就搞定,然后悠闲地品着下午茶逛淘宝;而自己加班加点搞到天亮还做不完。 为什么用户提出需求变更后,大牛只需潇洒地敲敲键...

一枚Sir
2015/04/10
0
0
Java语言编程学习之Lambda表达式设计和架构的原则[图]

Java语言编程学习之Lambda表达式设计和架构的原则[图]: 大家都知道,Lambda表达式是对Java语言的一点简单改进,在JDK标准类库中,运行它的方式各种各样。但是大多数的Java代码都不是由开发J...

原创小博客
07/17
0
0
【聚能聊话题】聊聊设计模式,封装算法——模板方法模式

前面我们聊了: 什么是设计模式?你知道多少? 你必须知道的六大设计原则 第一个设计模式,我是皇帝我独苗,单例模式 第二个设计模式,工厂方法模式 第三个设计模式,抽象工厂模式 这个真的很...

微wx笑
05/29
0
0
java设计模式-- 单例模式

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

爱学习的逃课君
2014/11/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一款成功的全球服游戏该如何进行架构选型与设计?

全球服游戏如今正在成为出海游戏的主要考虑模式,跨国对战、全球通服打破国界的限制,将不同地区不同语言的玩家放在一起合作/竞技,成功吸引了大量玩家的关注,并逐渐成为主流的游戏玩法。 ...

UCloudTech
6分钟前
0
0
StringUtils类中isEmpty与isBlank的区别

org.apache.commons.lang.StringUtils类提供了String的常用操作,最为常用的判空有如下两种isEmpty(String str)和isBlank(String str)。 StringUtils.isEmpty(String str) 判断某字符串是否为...

说回答
19分钟前
0
0
react native使用redux快速上手

看例图 要求点击组件一中的按钮,改版组件二的背景色。 利用state和props和容易实现。 //app.jsimport React, {Component} from 'react';import {StyleSheet, Button, View, Text} from ...

燕归南
21分钟前
0
0
页面输出JSON格式数据

package com.sysware.utils;import java.io.IOException;import javax.servlet.ServletResponse;import org.apache.log4j.Logger;import com.sysware.SyswareConstant;pub......

AK灬
42分钟前
0
0
springCloud-2.搭建Eureka Client的使用

1.使用IDEA,Spring Initializr创建 2.填写项目资料 3.选择spring boot版本,插件选择Cloud Discovery→Eureka Discovery 4.选择保存地址 5.修改application.yml eureka: client: s...

贺小康
45分钟前
0
0
CenOS 6.5 RPM 安装 elasticsearch 6.3.1

下载 wget --no-check-certificate https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.3.1.rpm...

阿白
48分钟前
0
0
1.4 创建虚拟机&1.5 安装CentOS7&1.6 配置ip(上)&1.7 配置ip(下)

1.4 创建虚拟机 知识点 虚拟机网络链接模式 桥连 直接将虚拟网卡桥接到一个物理网卡上面。需要手工为虚拟系统配置IP地址、子网掩码,而且还要和宿主机器处于同一网段,这样虚拟系统才能和宿主...

小丑鱼00
54分钟前
0
0
TrustAsia(亚洲诚信)助力看雪2018安全开发者峰会

2018年7月21日,看雪2018安全开发者峰会在北京国家会议中心圆满落下帷幕。拥有18年悠久历史的老牌安全技术社区——看雪学院联手国内最大开发者社区CSDN,汇聚业内顶尖的安全开发者和技术专家...

亚洲诚信
55分钟前
0
0
Spring注解介绍

@Resource、@AutoWired、@Qualifier 都用来注入对象。其中@Resource可以以 name 或 type 方式注入,@AutoWired只能以 type 方式注入,@Qualifier 只能以 name 方式注入。 但它们有一些细微区...

lqlm
今天
0
0
32位汇编在64位Ubuntu上的汇编和连接

本教程使用的操作系统是Ubuntu Linux 18.04 LTS版本,汇编器是GNU AS(简称as),连接器是GNU LD(简称ld)。 以下是一段用于检测CPU品牌的汇编小程序(cpuid2.s): .section .dataoutput...

ryanliue
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部