Java设计模式(21)——行为模式之备忘录模式(Memento)
一、概述
概念


UML简图

角色
根据下图得到角色

备忘录角色(Memento)、发起人角色(Originator)、负责人角色(Caretaker)
二、实践
使用白箱实现,给出角色的代码:
发起人
/**
* 发起者
*
* @author Administrator
**/
public class Originator {
/**
* 发起者想要保存的状态
*/
private String state; public String getState() {
return state;
} public void setState(String state) {
this.state = state;
} /**
* 返回备忘录角色的工厂方法
* @return 备忘录角色
*/
public Memento createMemento() {
return new Memento(state);
}
public void restoreMemento(Memento m) {
this.state = m.getState();
}
}
备忘录
/**
* 备忘录角色
*
* @author Administrator
**/
public class Memento {
private String state; public String getState() {
return state;
} public void setState(String state) {
this.state = state;
} public Memento(String state) {
this.state = state;
}
}
负责人
/**
* 负责人
*
* @author Administrator
**/
public class Caretaker {
private Memento memento; public Memento getMemento() {
return memento;
} public void setMemento(Memento memento) {
this.memento = memento;
}
}
客户端
/**
* 客户端
* @author Administrator
**/
public class Client {
private static Originator originator = new Originator();
private static Caretaker caretaker = new Caretaker();
public static void main(String[] args) {
// 改变发起人状态
originator.setState("new");
// 创建备忘录并由负责人保存
caretaker.setMemento(originator.createMemento());
// 修改发起人状态
originator.setState("show");
System.out.println(originator.getState());
// 恢复状态
originator.restoreMemento(caretaker.getMemento());
System.out.println(originator.getState());
}
}
三、改进与思考
这里就不再展开黑箱实现了,给出《Java与模式》中的实现方案

一些实际运用
例如WEB运用中输入表单的时候可以通过备忘录模式进行一些表单数据的回显。
Java设计模式(21)——行为模式之备忘录模式(Memento)的更多相关文章
- java设计模式-----21、备忘录模式
概念: Memento模式也叫备忘录模式又叫做快照模式(Snapshot Pattern)或Token模式,是GoF的23种设计模式之一,属于行为模式,它的作用是保存对象的内部状态,并在需要的时候(u ...
- 设计模式之第17章-备忘录模式(Java实现)
设计模式之第17章-备忘录模式(Java实现) 好男人就是我,我就是曾小贤.最近陈赫和张子萱事件闹得那是一个沸沸扬扬.想想曾经每年都有爱情公寓陪伴的我现如今过年没有了爱情公寓总是感觉缺少点什么.不知道 ...
- Java设计模式(14)责任链模式(Chain of Responsibility模式)
Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合, ...
- Java设计模式之十一种行为型模式(附实例和详解)
Java经典设计模式共有21中,分为三大类:创建型模式(5种).结构型模式(7种)和行为型模式(11种). 本文主要讲行为型模式,创建型模式和结构型模式可以看博主的另外两篇文章:J设计模式之五大创建型 ...
- Java设计模式(三) 抽象工厂模式
原创文章,同步发自作者个人博客,转载请注明出处 http://www.jasongj.com/design_pattern/abstract_factory/ 抽象工厂模式解决的问题 上文<工厂 ...
- Java设计模式(十二) 策略模式
原创文章,同步发自作者个人博客,http://www.jasongj.com/design_pattern/strategy/ 策略模式介绍 策略模式定义 策略模式(Strategy Pattern) ...
- Java设计模式(二) 工厂方法模式
本文介绍了工厂方法模式的概念,优缺点,实现方式,UML类图,并介绍了工厂方法(未)遵循的OOP原则 原创文章.同步自作者个人博客 http://www.jasongj.com/design_patte ...
- Java设计模式(一) 简单工厂模式不简单
摘要:本文介绍了简单工厂模式的概念,优缺点,实现方式,以及结合Annotation和反射的改良方案(让简单工厂模式不简单).同时介绍了简单工厂模式(未)遵循的OOP原则.最后给出了简单工厂模式在JDB ...
- Java设计模式(十一) 享元模式
原创文章,同步发自作者个人博客 http://www.jasongj.com/design_pattern/flyweight/.转载请注明出处 享元模式介绍 享元模式适用场景 面向对象技术可以很好的 ...
- Java 设计模式系列(二三)访问者模式(Vistor)
Java 设计模式系列(二三)访问者模式(Vistor) 访问者模式是对象的行为模式.访问者模式的目的是封装一些施加于某种数据结构元素之上的操作.一旦这些操作需要修改的话,接受这个操作的数据结构则可以 ...
随机推荐
- Oracle 查看占用undo大的sql语句
select s.sid,s.serial#,s.sql_id,v.usn,segment_name,r.status, v.rssize/1024/1024 mb from dba_roll ...
- python 爬虫网络图片中遇到的问题总结
1.只导入了import urllib,读取网页的时候page =urllib.urlopen(url),提示 “module’ object has no attribute ’urlopen’”, ...
- 常规渗透:没遇到过的anquan狗
0x01 信息收集 服务器信息: windows 2003 + IIS 6.0 + aspx . Php + 安全狗 站点cms信息:一套aspx新闻发布系统 和 Discuz X3 端口信息 : 服 ...
- sysctl.conf学习和调优
转载于简书:sysctl.conf学习和调优 ,如有版本问题,请联系我 前言 记得第一次接触/etc/security/limits.conf和/etc/sysctl.conf时是因为部署Oracle ...
- SpringMVC(1)
1.简要说明: Spring为展现层提供的基于MVC设计理念的优秀web框架,目前主流的框架 Spring3.0以后全面超越Struts2,成为最优秀的MVC框架 Spring MVC通过一套MVC注 ...
- mybatis框架的核心配置Mapper.xml
映射管理器resultMap:映射管理器,是Mybatis中最强大的工具,使用其可以进行实体类之间的关系,并管理结果和实体类间的映射关系 需要配置的属性:<resultMap id=" ...
- UglifyJS 压缩选项
UglifyJS 压缩选项 1.使用逗号运算符连接简单语句 2.使用点符号代替中括号属性 foo [“bar”]→foo.bar 3.删除逻辑上走不到的代码 4.删除调试代码 debug ...
- 解决iOS项目根目录下文件乱七八糟的问题
对于一个刚做项目的新手来说,肯定会碰到一个相当蛋疼的问题,那就是你在项目中建立的文件夹与你在根目录下的文件夹完全对应不起来,说直接点就是你通过group的方式在项目中建立的文件夹在本目录下根本就没有. ...
- Python入门基础:代码的编码风格
每种语言都有自己的编码风格,对于Python这种比较注重于空格的影响的代码而言,其风格也是相当重要的. 主要包括以下几点: 1:使用 4 空格缩进,而非 TAB .在小缩进(可以嵌套更深)和大缩进( ...
- linux c 获取当前时间 毫秒级的 unix网络编程
#include <time.h> #inlcude <sys/time.h> char *gf_time(void) /* get the time */{ struct t ...