教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

经典的GOF设计模式笔记(12)

来源:网络收集 时间:2026-10-01
导读: 东方标准 http://soft.oneedu.cn 12.行为 / 模板模式(Template) Template模板模式定义 : 定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。 使用Java的抽象类时,就经常会使用到Template模式,因此Tem

东方标准 http://soft.oneedu.cn

12.行为 / 模板模式(Template)

Template模板模式定义 : 定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。

使用Java的抽象类时,就经常会使用到Template模式,因此Template模式使用很普遍,而且很容易理解和使用。

public abstract class Benchmark { /**

* 下面操作是我们希望在子类中完成 */

public abstract void benchmark(); /**

* 重复执行benchmark次数 */

public final long repeat (int count) { if (count <= 0) return 0; else {

long startTime = System.currentTimeMillis();

for (int i = 0; i < count; i++) benchmark();

long stopTime = System.currentTimeMillis(); return stopTime - startTime; } } }

在上例中,我们希望重复执行benchmark()操作,但是对benchmark()的具体内容没有说明,而是延迟到其子类中描述:

public class MethodBenchmark extends Benchmark { /**

* 真正定义benchmark内容 */

public void benchmark() {

for (int i = 0; i < Integer.MAX_VALUE; i++){ System.out.printtln(\ } } }

至此,Template模式已经完成,是不是很简单?

我们称repeat方法为模板方法,它其中的benchmark()实现被延迟到子类MethodBenchmark中实现了,看看如何使用:

Benchmark operation = new MethodBenchmark();

long duration = operation.repeat(Integer.parseInt(args[0].trim()));

36

东方标准 http://soft.oneedu.cn

System.out.println(\

也许你以前还疑惑抽象类有什么用,现在你应该彻底明白了吧? 至于这样做的好处,很显然啊,扩展性强,以后Benchmark内容变化,我只要再做一个继承子类就可以,不必修改其他应用代码。

《===============戏说模板模式=================》

? 模板方法模式准备一个抽象类,将部分逻辑以具体方法以及具体构造子的形式实现,然后声明一

些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。先制定一个顶级逻辑框架,而将逻辑的细节留给具体的子类去实现。 ? 追MM圣经规定了追MM在不同时期有不同的步骤(Template method),但每个步骤针对不同的情

况,都有不一样的做法,这就要看你随机应变啦(具体实现)。

37

东方标准 http://soft.oneedu.cn

13.行为 / 备忘录模式(Memento)

定义:memento是一个保存另外一个对象内部状态拷贝的对象.这样以后就可以将该对象恢复到原先保存的状态。 备忘录模式相对也比较好理解,我们看下列代码: public class Originator { private int number; private File file = null;

public Originator(){} // 创建一个Memento public Memento getMemento(){ return new Memento(this); } // 恢复到原始值

public void setMemento(Memento m){ number = m.number; file = m.file; } }

我们再看看Memento类:

private class Memento implements java.io.Serializable{ private int number; private File file = null;

public Memento( Originator o){ number = o.number; file = o.file;

} }

可见 Memento中保存了Originator中的number和file的值,通过调用Originator中number和file值改变的话,通过调用setMemento()方法可以恢复。Memento模式的缺点是耗费大,如果内部状态很多,再保存一份,无意要浪费大量内存。 Memento模式在Jsp+Javabean中的应用在Jsp应用中: 我们通常有很多表单要求用户输入,比如用户注册,需要输入姓名和Email等, 如果一些表项用户没有填写或者填写错误,我们希望在用户按\提交Submit\后,通过Jsp程序检查,发现确实有未填写项目,则在该项目下红字显示警告或错误,同时,还要显示用户刚才已经输入的表项。 如右图中 First Name是用户已经输入,Last Name没有输入,我们则提示红字警告: 这种技术的实现,就是利用了Javabean的scope=\或scope=\特性,也就是Memento模式。 具体示例和代码见 JavaWorld的英文原文 , Javabean表单输入特性参见我的另外一篇文章 << Jsp中的session使用>>。 38

东方标准 http://soft.oneedu.cn

附:Jsp中的session使用 Jsp的session是使用bean的一个生存期限,一般为page,session意思是在这个用户没有离开网站之前一直有效,如果无法判断用户何时离开,一般依据系统设定,tomcat中设定为30分钟. 我们使用seesion功能,可以达到多个jsp程序从操作同一个java bean, 那么这个java bean可以作为我们传统意义上的\全局变量池\在java中我们可以使用static静态化一个变量和方法,使用singleton唯一化对象.) 在项目实践中,我们Jsp程序中很多参数需要从数据库中读取,有的参数实际读取一次就可以,如果设计成每个用户每产生一个页面都要读取数据库,很显然,数据库的负载很大,同时也浪费时间,虽然可能有数据库连接池优化,但是尽量少使用数据库是我们编程的原则. 比如,我们的test.jsp 和test1.jsp都需要得到一个参数userdir,这个userdir是从数据库中得知,使用session将大大优化性能,程序如下: 设计一个javabean 存储userdir. public class UserEnv { private String userdir = \private String userurl = \public UserEnv(){ //构建方法初始化userdir,可以从数据库中读取,这里简单给值ppp userdir=\System.out.println(\} public String getUserdir() throws Exception{ return userdir; } } test1.jsp程序: <%@ page contentType=\ Untitled this is test1.jsp:<%=myenv.getUserdir()%> test2.jsp程序: <%@ page contentType=\ Untitled this is test2.jsp:<%=myenv.getUserdir()%> 无论用户先调用test1.jsp还是test2.jsp, java bean UserEnv总是先初始化一次, 由于这个bean存在周期是seesion,因此该用户第二次以后只要在seesion有效期内再调用,myenv.getUserdir()将直接从bean内存中读取变量,不必再初始化.这样提高速度,又减少数据库访问量. 这样,我们就有了一个jsp程序之间共享变量或方法 的实现办法.

《===============戏说模板模式=================》

? 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用

意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。

? 同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现

了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存 …… 此处隐藏:2739字,全部文档内容请下载后查看。喜欢就下载吧 ……

经典的GOF设计模式笔记(12).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/603940.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150份
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)