模板模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤(这个我觉得很抽象,很抽象)

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的更多相关文章

  1. 设计模式:模版模式(Template Pattern)

    android中的Activity框架,View框架中大量的on函数基本上都应用到了Template模式,掌握这一模式对于理解这些框架大有裨益. 模版模式 又叫模板方法模式,在一个方法中定义一个算法的 ...

  2. 《JAVA设计模式》之模板模式(Template)

    在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...

  3. 设计模式:模版模式(Template Pattern)-转

    模版模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤. 我们使用冲泡咖啡和冲泡茶的例子 加工流程 ...

  4. 学习笔记——模板模式Template

    模板模式,主要是利用多态来实现具体算法和父类逻辑的松耦合.父类中TemplateMethod内部定义了相应的算法操作顺序,子类负责实现相应的具体实现. 举例: 项目中曾遇到过一个需求,叫做高级价格体系 ...

  5. 设计模式之模板模式 template

    设计模式 模板模式如果有一个流程如下step1();step2();step3();step4();step5();其中step3() step5()是需要用户自己编写使用其他步骤是固定的那么可以写成 ...

  6. 【编程思想】【设计模式】【行为模式Behavioral】模板模式Template

    Python转载版 https://github.com/faif/python-patterns/blob/master/behavioral/template.py #!/usr/bin/env ...

  7. php模板模式(template design)

    没有写停止条件,所以会一直运行哟. <?php /* The template design pattern defines the program skeleton of an algorit ...

  8. 设计模式(十四)——模板模式(SpringIOC源码分析)

    1 豆浆制作问题 编写制作豆浆的程序,说明如下: 1) 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 2) 通过添加不同的配料,可以制作出不同口味的豆浆 3 ...

  9. 设计模式之GOF23模板模式

    模板模式template method 场景:具有具体流程,但具体某一步的业务不同 到银行办理业务:排队取号,办理业务,给员工打分 请客吃饭:等待,点单,吃饭,结账 模板方法模式介绍:模板方法是编程常 ...

  10. 13.java设计模式之模板模式

    基本需求: 制作豆浆的流程 选材--->添加配料--->浸泡--->放到豆浆机打碎 通过添加不同的配料,可以制作出不同口味的豆浆 选材.浸泡和放到豆浆机打碎这几个步骤对于制作每种口味 ...

随机推荐

  1. httpd 系统错误 无法启动此程序,因为计算机中丢失VCRUNTIME140.dll

    说来话长的搭了一个discuz论坛,服务器是apache,我本地的是直接从官网下的(值得吐槽的是官网居然拿不提供编译版本么要从第三方网站获取,不知道为何....),对应apache之前是搭bug管理系 ...

  2. Git(四):Git远程操作详解

    转: http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  3. MyBatis 学习记录1 一个简单的demo

    主题 最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...

  4. LInux命令执行http请求

    Linux下提供了一些命令可以直接执行http请求,下面举例来介绍几个命令. http // GET请求 http http://127.0.0.1:2379/version http GET htt ...

  5. OPEN LDAP

    一.安装OPENLDAP 安装完成后退出 编辑两个文本,输入以下内容,并把文本文件改名为ldap01.ldif和ldap02.ldif. ldap01.ldif: dn: dc=maxcrc,dc=c ...

  6. 【总结整理】UGC内容

    除了内容了产品,还有什么适合引入UGC? :引发讨论,诱导参与,然后促成销售. User Generated Content,也就是用户生成内容的意思. 购买类产品,内容催生购买 1.为用户购买提供思 ...

  7. EasyBuy项目总结_20180409

    一.项目技术点 1.熟练使用jsp及el和jstl表达式 el: $() jstl: 1.导包; 2.声明<%@ taglib uri=" " preffix="c ...

  8. Java工具类之Apache的Commons Lang和BeanUtils

    Apache Commons包估计是Java中使用最广发的工具包了,很多框架都依赖于这组工具包中的一部分,它提供了我们常用的一些编程需要,但是JDK没能提供的机能,最大化的减少重复代码的编写. htt ...

  9. line1: 1: Syntax error: word unexpected (expecting ")")

    行时错误:line1: 1: Syntax error: word unexpected (expecting ")") 查看Makefile编译规则,可能由于依赖关系造成编译器使 ...

  10. Openssl s_time命令

    一.简介 s_time是openss提供的SSL/TLS性能测试工具,用于测试SSL/TSL服务 二.语法 openssl s_time [-connect host:port] [-www page ...