Memento:客户端瘦身
说是客户端瘦身,其实备忘录模式的本质让调用客户端职责减轻,将客户端的对于实现比如数据恢复之类细节的内容封装在操作类之中。其实面向对象的一重要方面就是划分清楚职责,这样可以减少改到造成的影响,便于扩展。

Originator的职责是负责备忘录数据对象的生产以及回复,并保存当前版本数据对象,Originator本身是“宽接口”,可以对备忘数据进行修改和读取;
CareTaker则是负责备忘数据的存储,具有“窄接口”,可以只提供对备忘数据的读取功能。
Memento数据实体,Memento对象可以是结构,也可以实现IClone接口以实现原型模式,因为Originator在保存备忘的时候是希望能够返回一个全新的对象,而不是被关联的对象。
示例:
实现类
public class Originator
{
public Memento myMemento = null; public Memento SaveMemento()
{
return myMemento.Clone() as Memento;
} public void SetMemento(Memento pMemento)
{
this.myMemento = pMemento;
}
} public class Memento : ICloneable
{
public string Name;
public string Address;
public int Age; public object Clone()
{
return this.MemberwiseClone();
}
} public class CareTaker
{
private Memento myMemento = null; public Memento MyMemento
{
get { return myMemento; }
set { myMemento = value; }
}
}
调用客户端
class Program
{
static void Main(string[] args)
{
Memento m = new Memento();
m.Address = "Beijing";
m.Age = 23;
m.Name = "Lorry"; Originator org = new Originator();
org.SetMemento(m);
Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age); CareTaker taker = new CareTaker();
taker.MyMemento = org.SaveMemento(); org.myMemento.Address = "Dalian";
org.myMemento.Age = 34;
Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age); org.SetMemento(taker.MyMemento);
Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age); Console.Read();
}
}
Memento:客户端瘦身的更多相关文章
- Redis “瘦身”指南
code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...
- iOS 安装包瘦身(下篇)
本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...
- 39、apk瘦身(转载)
本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用 ...
- iOS图片瘦身总结
前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...
- Docker系列之镜像瘦身(五)
前言 本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小,温馨提示:文中大图均可点击放大查看详细信息. 缓存(cache) Docker的优势之一在于提供了缓存, ...
- Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)
Android XML shape 标签使用详解 一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...
- Android APK瘦身之Android Studio Lint (代码审查)
******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...
- 【直播】APP全量混淆和瘦身技术揭秘
[直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪 ...
- APK瘦身记,如何实现高达53%的压缩效果
作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...
随机推荐
- (4/18)重学Standford_iOS7开发_框架和带属性字符串_课程笔记
第四课(干货课): (最近要复习考试,有点略跟不上节奏,这节课的内容还是比较重要的,仔细理解掌握对今后的编程会有很大影响) 本节课主要涉及到Foundation和UIKit框架,基本都是概念与API知 ...
- Javascript从入门到精通(一)
第一篇 基础知识 一.JavaScript的主要特点:1.解释性:不同于一些编译性的程序语言(如C.C++等),它是一种解释性的程序语言,它的源代码不需要经过编译,而是直接在浏览器中运行时被解释. ...
- C#使用Sockets操作FTP【转载】
using System; using System.Collections; using System.IO; using System.Net; using System.Net.Sockets; ...
- BMVC reading list
'Combining Local and Global Cues for Closed Contour Extraction' Vida Movahedi, James Elder 'FRIF: Fa ...
- MYSQL 学习笔记1 -----mysqladmin -uroot -p status|extended-status
root@server1 ~]# mysqladmin -uroot -p status -i -r extended-status|grep Handler_commit Enter passwor ...
- QT皮肤系统的动态切换
应用需求: 提供皮肤切换选项,在不重启应用程序的情况下实现皮肤的动态切换. 理论基础: 1) 图片资源是如何被利用的 这里先简要说明一下实现原理,皮肤的动态切换其关键在于图片资源的加载方式.QT中每个 ...
- jackson 学习笔记
Jackson以优异的解析性能赢得了好评,今天就看看Jackson的一些简单的用法. Jackson使用之前先要下载,这里一共有三个jar包,想要获得完美的Jackson体验,这三个jar包都不可或缺 ...
- 使用Socket模拟一个简单的Webservice调用
webservice是对socket的一个封装,让远程调用调用变得更加简单,那么使用socket究竟有多么麻烦呢?来看看. 做一个简单的天气查询: 服务端: public class SocketSe ...
- struts2 ajax 实现方式
在 struts2 中实现ajax,可以使用struts2-json-plugin扩展,但是返回的json字段必须都是Action中的属性,不可以随意的输出文本. 返回任意的文本有两种方式, 方法一: ...
- ubuntu16.04 : 4: [: y: unexpected operator
Ubuntu16.04 执行行脚本出错 在使用sh 执行脚本 出错标志 : 4: [: y: unexpected operator 原因:sh是连接到dash的,又因为dash跟bash的不兼容所以 ...