#每天一种设计模式# 模板方法

news/2024/9/9 14:30:05

《松本行弘的程序世界》对模板方法(Template method)的说明非常清晰:

在父类的一个方法中定义算法的框架,其中几个步骤的具体内容则留给子类来实现。

 

比如一个用于公司欢迎同事的程序:

 

class Adef initialize@name = "jinbin"@word = "hello"end def say_wordputs "Welcome to New Company"puts "#@word,#@name"end 
enda=A.new
a.say_word

 

 某天,需求忽然增加了,不仅要适用于公司,还需要适用于学校。Still easy:

 

class Adef initialize@name = "jinbin"@word = "hello"end def say_word symbolif symbol == "company"puts "Welcome to New Company"elsif symbol == "school"puts "Welcome to New School"end puts "#@word,#@name"end 
enda=A.new
a.say_word "company"
a.say_word "school"

 

然后又有一天,需求又变了,原来的欢迎词太单调了,希望针对不同场景设计不同的欢迎词;然后又希望能增加对医院、法院等等场景的支持,然后又有一天,希望你能支持欢迎多人的工作。。。

OK!我们冷静一下,思考下最基本的问题,什么是在变的?什么是保持不变的?

场景在变,以及对应的欢迎词在变化,但是欢迎词的输出步骤没有变化,一段描述性文字,再加上个人信息。OK,我们将变与不变的部分分离开。

 

class A def initialize@name = "jinbin"@word = "hello"end def say_wordsay_welcomesay_personalend def say_welcomeraise "Called abstract method : say_welcome"end def say_personalraise "Called abstract method : say_personal"end 
endclass Company_welcome < A def say_welcomeputs "Welcome to New Company"end def say_personalputs "#@word,#@name"end 
enda=Company_welcome.new
a.say_word 

 

no matter 你的场景怎么变,我只需要根据你的需求编写继承类中对应的方法就OK了。

 

Template Method Pattern 也许是GoF pattern中最简单的一种了。


 

 


http://lihuaxi.xjx100.cn/news/223150.html

相关文章

HTTPS协议简介

HTTPS(HyperText Transfer Protocol Secure, 超文本传输安全协议)&#xff1a;是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信&#xff0c;但利用SSL/TLS来加密数据包。HTTPS开发的主要目的&#xff0c;是提供对网站服务器的身份认证&#xff0c;保护交换…

【FFmpeg】ffmpeg工具源码分析(四):filter(过滤器、滤镜)详解

1、简介 FFmpeg用来处理音视频,实现处理功能的核心就是filter(滤镜),和我们使用的美颜功能的滤镜意思差不多,FFmpeg的filter(滤镜)不仅可以处理视频,还能处理音频、字幕等。 官方说明: 在编码之前,ffmpeg可以使用 libavfilter 库中的过滤器处理原始音频和视频帧。几…

保持dropdownlist选中值

RowDataBound事件 protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e) { int i; for (i 0; i < GridView1.Rows.Count; i) { if (e.Row.RowType DataControlRowType.DataRow) { e.Row.Attributes.Ad…

博客园美化技巧汇总

首先得有js权限 1.1 页脚js代码 <script type"text/javascript"> /*功能&#xff1a;生成博客目录的JS工具测试&#xff1a;IE8&#xff0c;火狐&#xff0c;google测试通过zhang_derek2018-01-03 */ var BlogDirectory {/*获取元素位置&#xff0c;距浏览器左…

【FFmpeg】FFmpeg编解码H264产生马赛克、伪影的解决方法

1、问题描述 使用FFmpeg编码H264,再解码显示时,产生马赛克:有时是在画面静止时,静止时间越长,马赛克、伪影越多;有时是在画面切入切出时;有时是在网络带宽不够时 2、原因分析 2.1 丢帧 网络状况差的情况下(带宽不足),容易丢帧,在视频画面播放过程中,若I帧丢失了,…

base64开源库介绍及使用

网上有一些开源的base64编解码库的实现&#xff0c;下面介绍几个&#xff1a; cppcodec是一个仅包括头文件的C11库&#xff0c;用于编解码RFC 4648中指定的base64, base64url, base32, base32hex等&#xff0c;它的License为MIT&#xff0c;源码在https://github.com/tplgy/cp…

Ruby之Enumerator类

今天发现了Ruby1.8.6和 Ruby1.9.2的一个不同之处&#xff0c;试运行以下代码&#xff1a; require findputs Find.find("./data").class 在Ruby1.9.2中&#xff0c;最后的结果是Enumerator&#xff0c;而在Ruby1.8.6中&#xff0c;结果则是find: no block given (L…

Storm:最火的流式处理框架

伴随着信息科技日新月异的发展&#xff0c;信息呈现出爆发式的膨胀&#xff0c;人们获取信息的途径也更加多样、更加便捷&#xff0c;同时对于信息的时效性要求也越来越高。举个搜索场景中的例子&#xff0c;当一个卖家发布了一条宝贝信息时&#xff0c;他希望的当然是这个宝贝…