经典的GOF设计模式笔记(12)
东方标准 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=\
《===============戏说模板模式=================》
? 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象。备忘录模式的用
意是在不破坏封装的条件下,将一个对象的状态捉住,并外部化,存储起来,从而可以在将来合适的时候把这个对象还原到存储起来的状态。
? 同时跟几个MM聊天时,一定要记清楚刚才跟MM说了些什么话,不然MM发现
了会不高兴的哦,幸亏我有个备忘录,刚才与哪个MM说了什么话我都拷贝一份放到备忘录里面保存 …… 此处隐藏:2739字,全部文档内容请下载后查看。喜欢就下载吧 ……
相关推荐:
- [高等教育]公司协助某村精准扶贫工作总结.doc
- [高等教育]高二生物知识点总结(全)
- [高等教育]苏教版数学三年级下册《解决问题的策略
- [高等教育]仪器分析课程学习心得
- [高等教育]2017年五邑大学数学与计算科学学院333
- [高等教育]人教版七年级下册语文第四单元测试题(
- [高等教育]2018年秋七年级英语上册Unit7Howmuchar
- [高等教育]2017年八年级下数学教学工作小结
- [高等教育]湖南省怀化市2019届高三统一模拟考试(
- [高等教育]四年级下册科学_基础训练及答案教材
- [高等教育]城郊煤矿西风井管路伸缩器更换施工安全
- [高等教育]昆八中20182019学年度上学期期末考试
- [高等教育]项目部各类人员任命书
- [高等教育]上市公司经营水务产业的模式
- [高等教育]人教版高二化学第一学期第三章水溶液中
- [高等教育]【中考物理第一轮复习资料】四.压强与
- [高等教育]金坑水电站报废改建工程机电设备更新改
- [高等教育]高中生物教学工作计划简易版
- [高等教育]2017年西华大学攀枝花学院(联合办学)44
- [高等教育]最新整理超短爆笑英文小笑话大全
- 优秀教师继续教育学习心得体会
- 阳历到阴历的转换
- 留守儿童教育案例分析
- 华师17春秋学期《玩教具制作与环境布置
- 测速传感器新型安装装置的现场应用
- 人教版小学数学三年级下册第四单元
- 创业个人意向书
- 山东省潍坊市2012年高考仿真试题(三)
- [恒心][好卷速递]四川省成都外国语学校
- 多少人错把好转反应当成了病情加重处理
- 中外广播电视史复习资料整理
- 江苏省扬州市江都区宜陵镇中学2014-201
- 工程造价专业毕业实习报告
- 广西师范学院心理与教育统计
- aympkrq基于 - asp的博客网站设计与开
- 建筑业外出经营相关流程操作(营改增后
- 人治 德治 法治
- [精华篇]常识判断专项训练题库
- 中国共产党为什么要实行民主集中
- 小学数学第三册第一单元试卷(A、B、C




