【模板模式】 Template Pattern
模板模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤(这个我觉得很抽象,很抽象) e:学会说“不”,把时间用在更重要的事情上
案例:在一组监控的程序中,我们需要记录程序启动和结束一些信息(日志能通过上下文的信息根据约定自动生成)
//Ingore the unreasonable class name, just for presentation
public abstract class BaseClass
{
protected void LogStart()
{
Console.WriteLine("Log Start Infomation");
} protected void LogEnd()
{
Console.WriteLine("Log End Infomation");
} public abstract void DoWork(); } public class FirstSubClass : BaseClass
{
public void Execute()
{
base.LogStart(); DoWork(); base.LogEnd();
} public override void DoWork()
{
Console.WriteLine(this.GetType().Name + "Do Work");
}
}
这里的不当之处在哪里?如你所见,子类负责在Execute()方法执行中的特定点调用基类,这样导致子类的编写人员需要记住这些方法,并在合适的时候调用(子类程序员好累有木有,要记住好多东西),另外一个不当之处,如果我们并不想子类能隐藏或者重写我们的日志记录,这里就会有一个隐患出现:
public class FirstSubClass : BaseClass
{
protected new void LogStart()
{
Console.WriteLine("111Log Start Infomation");
}
public void Execute()
{
LogStart(); DoWork(); LogEnd();
} public override void DoWork()
{
Console.WriteLine(this.GetType().Name + "Do Work");
}
}
我们重写了一下子类,用new关键字把父类的LogStart()方法隐藏了,这样的话我们调用的时候会直接调用子类的LogStart()。我们用模板模式来解决一下这两个问题:
//Ingore the unreasonable class name, just for presentation
public abstract class BaseClass
{
private void LogStart()
{
Console.WriteLine("Log Start Infomation");
} private void LogEnd()
{
Console.WriteLine("Log End Infomation");
} public abstract void DoWork();
public void Execute()
{
LogStart(); DoWork(); LogEnd();
} } public class FirstSubClass : BaseClass
{ public override void DoWork()
{
Console.WriteLine(this.GetType().Name + "Do Work");
}
}
我们把LogStart(),LogEnd()的权限都设置成private,这样子类就不能改变我们固定的算法了(这是完全根据业务需求来决定),把Execute提到父类,让父类来控制流程,而只让子类填写可变的算法(函数),我们子类编写人员只要根据父类的限定(abstract的方法)来编写对应的算法就好了,这样在写单元测试的时候也更加的单一化,只需要对子类自身实现的算法进行有效性测试就可以了。
若有不对,不足之处请指出,请不要只写一个:漏洞百出此类评价,谢谢大家的指点和帮助!
【模板模式】 Template Pattern的更多相关文章
- 设计模式:模版模式(Template Pattern)
android中的Activity框架,View框架中大量的on函数基本上都应用到了Template模式,掌握这一模式对于理解这些框架大有裨益. 模版模式 又叫模板方法模式,在一个方法中定义一个算法的 ...
- 《JAVA设计模式》之模板模式(Template)
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- 设计模式:模版模式(Template Pattern)-转
模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程 ...
- 学习笔记——模板模式Template
模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系 ...
- 设计模式之模板模式 template
设计模式 模板模式如果有一个流程如下step1();step2();step3();step4();step5();其中step3() step5()是需要用户自己编写使用其他步骤是固定的那么可以写成 ...
- 【编程思想】【设计模式】【行为模式Behavioral】模板模式Template
Python转载版 https://github.com/faif/python-patterns/blob/master/behavioral/template.py #!/usr/bin/env ...
- php模板模式(template design)
没有写停止条件,所以会一直运行哟. <?php /* The template design pattern defines the program skeleton of an algorit ...
- 设计模式(十四)——模板模式(SpringIOC源码分析)
1 豆浆制作问题 编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3 ...
- 设计模式之GOF23模板模式
模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常 ...
- 13.java设计模式之模板模式
基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...
随机推荐
- 22_java之File对象
01IO技术概述 * A:IO技术概述 * a: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 * b: Input * 把持久设备上的数据读取到内存中的这 ...
- mongodb Java(八)
package com.mongodb.text; import java.net.UnknownHostException; import com.mongodb.DB; import com.mo ...
- python查找文件相同的和包含汉字的
#!/usr/bin/env python # Version = 3.5.2 import os import time d_path = '/data/media' log_file = 'res ...
- IOS 后台之长时间任务 beginBackgroundTaskWithExpirationHandler 申请后台十分钟 600秒
10分钟 beginBackgroundTaskWithExpirationHandler,beginBackgroundTaskWithName endBackgroundTask 定义变量 UIB ...
- WOW研究资料收集
1,模拟服务器:trinity core, sunwell core等 参考:逍遥魔兽 2,大芒果:通用网游框架,带了WOW的模拟模块 参考资料: 大芒果论坛http://www.mangoscn.c ...
- VNC Linux 远程桌面控制软件
简介: VNC (Virtual Network Computer)是虚拟网络计算机的缩写. VNC 是一款优秀的远程控制工具软件,VNC 是在基于 UNIX 和 Linux 操作系统的免费的开源软件 ...
- Hibernate的HQL中in参数设置
平时经常用Hibernate,由于习惯表间不建立关联,所以HQL查询时候经常要用in语句. 我最常用的情况有2种: 1.in后是个子查询,如 FROM A WHERE A.ID IN (SELECT ...
- <mvc:annotation-driven />讲解
<mvc:annotation-driven />是一种简写形式,完全可以手动配置替代这种简写形式,简写形式可以让初学者快速应用默认配置方案.<mvc:annotation-driv ...
- MySQL篇之Navicat可视化工具
主要内容: Navicat工具的介绍和使用 1.介绍和下载安装 <1>介绍 Navicat是一款针对MySQL数据库开发的可视化管理工具,以图形界面的形式操作MySQL数据库. 但在生产环 ...
- Superset安装
Superset version 1.8.5 # Install superset pip install cairocffi pip install superset yum ...