JAVA模板方法设计模式(从现实生活角度理解代码原理)
概述:
定义一个功能的框架(骨架),一部分功能是确定的,一部分功能是不确定的,先把确定的部分实现,把不确定的部分延迟到子类中实现。
实现该模式的关键步骤:
第一步:抽象类,实现模板方法,定义功能(确定的以及不确定的)的框架。
第二步:具体类,实现抽象类中的抽象方法,已完成完整的功能。
老规矩,最近想整一台BMW1系,去了趟4S店,店里恰好有一台现车,但颜色我不太喜欢,这时服务顾问上来解释说:“先生,您看中的这台车就这一个型号,外观,发动机,内饰等配置都是一样的,但颜色是可以个性化定制的,所以这个您不用担心”。这里大家该明白了,这就是一个典型的模板方法了,确定的功能是发动机,外观,内饰等,不确定的就是颜色了。那我们就开始代码实现了,毕竟作为程序员,只有敲好了代码才买得起宝马啊
:
第一步:抽象类,定义功能框架
abstract class BuyCar{
public void buy(){
//确定的功能
System.out.println("欢迎来到宝马4S店,我给你介绍下你选的这款车");
System.out.println("外观:两厢,家族式双肾栅格,典型的宝马脸");
System.out.println("发动机:2.0L双涡管单涡轮增压发动机");
System.out.println("内饰:。。。。。。。。");
System.out.println("这款车整体请看就是这样,但颜色可以选择,你想要白色还是红色呢?");
//不确定的功能选项
chooseColor();
}
//对不确定功能定义抽象方法供具体类实现
public abstract void chooseColor();
}
第二步:具体类,实现抽象方法
class Man extends BuyCar{
public void chooseColor(){
System.out.println("白色的");
}
}
测试类:
public class TemplateMethod{
public static void main(String[] args){
Man m = new Man();
m.buy();
}
}
输出结果:
欢迎来到宝马4S店,我给你介绍下你选的这款车
外观:两厢,家族式双肾栅格,典型的宝马脸
发动机:2.0L双涡管单涡轮增压发动机
内饰:。。。。。。。。
这款车整体请看就是这样,但颜色可以选择,你想要白色还是红色呢?
白色的
就这样,我的购车之旅就结束了。也对模板方法有了新的感悟:
该模式有他的优点,比如说:
(1)模板方法模式通过把不变的行为搬移到超类,去除了子类中的重复代码。
(2)子类实现算法的某些细节,有助于算法的扩展。
(3)通过一个父类调用子类实现的操作,通过子类扩展增加新的行为,符合“开放-封闭原则”。
但是缺点也同样明显:每个不同的实现都需要定义一个子类,这会导致类的个数的增加,设计更加抽象。
JAVA模板方法设计模式(从现实生活角度理解代码原理)的更多相关文章
- JAVA适配器模式(从现实生活角度理解代码原理)
说道JAVA中的适配器模式,不得不引用该设计模式的固定表述"适配器模式(Adapter ):将一个类的接口转换成客户希望的另外一个接口,适配器模式使得原本由于接口不兼容而不能一起工作的那些类 ...
- JAVA装饰者模式(从现实生活角度理解代码原理)
装饰者模式可以动态地给一个对象添加一些额外的职责.就增加功能来说,Decorator模式相比生成子类更为灵活. 该模式的适用环境为: (1)在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职 ...
- JAVA简单工厂模式(从现实生活角度理解代码原理)
简单工厂模式(Simple Factory),说他简单是因为我们可以将此模式比作一个简单的民间作坊,他们只有固定的生产线生产固定的产品.也可以称他为静态工厂设计模式,类似于之前提到过静态代理设计模式, ...
- JAVA动态代理模式(从现实生活角度理解代码原理)
所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...
- JAVA静态代理模式(从现实生活角度理解代码原理)
代理模式(Proxy):为其他对象提供一种代理以控制对这个对象的访问. 代理模式说白了就是"真实对象"的代表,在访问对象时引入一定程度的间接性,因为这种间接性可以附加多种用途. 在 ...
- 【C#硬件角度理解代码】函数
函数的执行过程
- java常量,变量,静态变量的理解
最近考试出了一个很简单的题,看看他们对java常量,变量,静态变量的理解,代码如下: public class TestVar { /** * JAVA基础,常量,变量,静态变量 */ public ...
- 从源码角度理解Java设计模式——装饰者模式
一.饰器者模式介绍 装饰者模式定义:在不改变原有对象的基础上附加功能,相比生成子类更灵活. 适用场景:动态的给一个对象添加或者撤销功能. 优点:可以不改变原有对象的情况下动态扩展功能,可以使扩展的多个 ...
- Java抽象类深入理解-----模板方法设计模式(Templete Method)
模板方法设计模式(Templete Method) 定义一个操作中的算法骨架,而将一些可变部分的实现延迟到子类中. 模板方法设计模式使得子类可以不改变一个算法的结构即可重新定义该算法某些特定的步骤. ...
随机推荐
- WPF自定义控件与样式(2)-自定义按钮FButton
一.前言.效果图 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 还是先看看效果 ...
- Android全屏(包含3种隐藏顶部状态栏及标题栏和一种隐藏Android 4.0平板底部状态栏的方法)
http://www.xuebuyuan.com/558284.html 方法一 public class MainActivity extends Activity { @Override prot ...
- .Net 转战 Android 4.4 日常笔记(2)--HelloWorld入门程序
我不知道人们为什么那么喜欢用HelloWorld来做为自己的第一个程序入门,为什么不是hello **其他的东西或者hi. 一.打开ADT 的Eclipse开发工具新建一个Android项目 New- ...
- 访问外网 ML2 的配置 - 每天5分钟玩转 OpenStack(103)
通过 router 可以实现位于不同 vlan 中的 instance 之间的通信. 接下来要探讨的问题是 instance 如何与外部网络通信. 这里的外部网络是指的租户网络以外的网络. 租户网络是 ...
- 理解 Neutron Server 分层模型 - 每天5分钟玩转 OpenStack(69)
本节开始讨论 Neutron 的各个服务组件,首先学习 Neutron Server . 上图是 Neutron Server 的分层结构,至上而下依次为: Core API对外提供管理 networ ...
- 【记录】T-SQL 分组排序中取出最新数据
示例 Product 表结构: 示例 Product 表数据: 想要的效果是,以 GroupName 字段分组,取出分组中通过 Sort 降序最新的数据,通过示例数据,可以推算出结果数据的 ID 应该 ...
- 奇妙的NULL值,你知道多少
<NULL值的多义性分析> 谈到NULL值,很多人都是很熟悉,但是深入了解后,又感觉到陌生,对其含义和用法,都无法很准确的理解.NULL在数据库和编程语言中,存在的意义和附带的含义不同. ...
- 通过寄生组合式继承创建js的异常类
最近项目中在做js的统一的异常处理,需要自定义异常类.理想的设计方案为:自定义一个异常错误类BaseError,继承自Error,然后再自定义若干个系统异常,例如用户取消异常.表单异常.网络异常,这些 ...
- 浅尝ECMAScript6
浅尝ECMAScript6 简介 ECMAScript6 是最新的ECMAScript标准,于2015年6月正式推出(所以也称为ECMAScript 2015),相比于2009年推出的es5, es6 ...
- jackson error 含义log
1. 反序列化失败,类型不匹配 Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserial ize ...