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

Originator的职责是负责备忘录数据对象的生产以及回复,并保存当前版本数据对象,Originator本身是“宽接口”,可以对备忘数据进行修改和读取;
CareTaker则是负责备忘数据的存储,具有“窄接口”,可以只提供对备忘数据的读取功能。
Memento数据实体,Memento对象可以是结构,也可以实现IClone接口以实现原型模式,因为Originator在保存备忘的时候是希望能够返回一个全新的对象,而不是被关联的对象。

示例:
实现类

  1. public class Originator
  2. {
  3. public Memento myMemento = null;
  4.  
  5. public Memento SaveMemento()
  6. {
  7. return myMemento.Clone() as Memento;
  8. }
  9.  
  10. public void SetMemento(Memento pMemento)
  11. {
  12. this.myMemento = pMemento;
  13. }
  14. }
  15.  
  16. public class Memento : ICloneable
  17. {
  18. public string Name;
  19. public string Address;
  20. public int Age;
  21.  
  22. public object Clone()
  23. {
  24. return this.MemberwiseClone();
  25. }
  26. }
  27.  
  28. public class CareTaker
  29. {
  30. private Memento myMemento = null;
  31.  
  32. public Memento MyMemento
  33. {
  34. get { return myMemento; }
  35. set { myMemento = value; }
  36. }
  37. }

调用客户端

  1. class Program
  2. {
  3. static void Main(string[] args)
  4. {
  5. Memento m = new Memento();
  6. m.Address = "Beijing";
  7. m.Age = 23;
  8. m.Name = "Lorry";
  9.  
  10. Originator org = new Originator();
  11. org.SetMemento(m);
  12. Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age);
  13.  
  14. CareTaker taker = new CareTaker();
  15. taker.MyMemento = org.SaveMemento();
  16.  
  17. org.myMemento.Address = "Dalian";
  18. org.myMemento.Age = 34;
  19. Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age);
  20.  
  21. org.SetMemento(taker.MyMemento);
  22. Console.WriteLine("Address:{0}; Age:{1}", org.myMemento.Address, org.myMemento.Age);
  23.  
  24. Console.Read();
  25. }
  26. }

Memento:客户端瘦身的更多相关文章

  1. Redis “瘦身”指南

    code[class*="language-"], pre[class*="language-"] { background-color: #fdfdfd; - ...

  2. iOS 安装包瘦身(下篇)

    本文来自网易云社区 作者:饶梦云 2.4. 清理无用代码 2.4.1. Dead Code Stripping Activating this setting causes the -dead_str ...

  3. 39、apk瘦身(转载)

    本文转自::Android开发中文站 » 关于APK瘦身值得分享的一些经验 从APK的文件结构说起 APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用 ...

  4. iOS图片瘦身总结

    前言 最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量. 瘦身是在一个专门为图片瘦身的网站进行的. 地址:https://tinypng.com 这个网站提供 ...

  5. Docker系列之镜像瘦身(五)

    前言 本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小,温馨提示:文中大图均可点击放大查看详细信息. 缓存(cache) Docker的优势之一在于提供了缓存, ...

  6. Drawable实战解析:Android XML shape 标签使用详解(apk瘦身,减少内存好帮手)

    Android XML shape 标签使用详解   一个android开发者肯定懂得使用 xml 定义一个 Drawable,比如定义一个 rect 或者 circle 作为一个 View 的背景. ...

  7. Android APK瘦身之Android Studio Lint (代码审查)

    ******** ******** 第一部分: 瘦身内容介绍 ******** ******** 项目新版本的迭代接近尾声, 因为历史累积问题, 导致有很多无效的资源让已经臃肿的APK变得更肿, 因此 ...

  8. 【直播】APP全量混淆和瘦身技术揭秘

    [直播]APP全量混淆和瘦身技术揭秘 近些年来移动APP数量呈现爆炸式的增长,黑产也从原来的PC端转移到了移动端,通过逆向手段造成数据泄漏.源码被盗.APP被山寨.破解后注入病毒或广告现象让用户苦不堪 ...

  9. APK瘦身记,如何实现高达53%的压缩效果

    作者:非戈@阿里移动安全 1.我是怎么思考这件事情的 APK是Android系统安装包的文件格式,关于这个话题其实是一个老生常谈的题目,不论是公司内部,还是外部网络,前人前辈已经总结出很多方法和规律. ...

随机推荐

  1. 【转】Cannot change version of project facet Dynamic Web Module to 3.1 (Eclipse Maven唯一解决方案)

    If you want to use version 3.1 you need to use the following schema: http://xmlns.jcp.org/xml/ns/jav ...

  2. easyui常用控件样式收藏

    CSS类定义: div easyui-window                               window窗口样式 属性如下: 1)       modal:是否生成模态窗口.tru ...

  3. git 命令归纳

    git 新手一枚,随用随更新 git clone git@example.com:project-name.git 克隆 git branch [-a -r] 查看分支[所有 远端] git pull ...

  4. QT实现多语言切换

    功能需求: 网盘客户端要能够实现多国语言的切换,第一版要支持中.英文的切换.在实现过程中感觉QT对多国语言的支持还是很不错的,制作多语言包很方便,切换的逻辑也很简单.下面就来看一下QT中如何制作多语言 ...

  5. Spring远端调用的实现-Spring Http调用的实现

    1:Spring Http设计思想 最近在研究公司自己的一套rpc远程调用框架,看到其内部实现的设计思想依赖于spring的远端调用的思想,所以闲来无事,就想学习下,并记录下. 作为spring远端调 ...

  6. Java基础知识强化之IO流笔记26:FileInputStream / FileOutputStream 复制mp4视频的案例

    1.  需求:把D:\\English.mp4 复制到当前项目目录下copy.mp4 代码示例: package com.himi.filecopy; import java.io.FileInput ...

  7. Android图片异步加载之Android-Universal-Image-Loader

    将近一个月没有更新博客了,由于这段时间以来准备毕业论文等各种事务缠身,一直没有时间和精力沉下来继续学习和整理一些东西.最近刚刚恢复到正轨,正好这两天看了下Android上关于图片异步加载的开源项目,就 ...

  8. CentOS7添加第三方源

    CentOS由于很追求稳定性,所以官方源中自带的软件不多,因而需要一些第三方源,比如EPEL.ATrpms.ELRepo.Nux Dextop.RepoForge等. EPEL EPEL即Extra ...

  9. GitHub安装失败

    安装GitHub客户端的时候,会提示失败,如下: An error occurred trying to download 'http://github-windows.s3.amazonaws.co ...

  10. php strtotime函数服务器和本地不相同

    遇到过一种情况strtotime 在本地和服务器不相同 服务器返回的是-1 strtotime($sa_sagyo_ymd."23:59:59") 如果这样用不了,就只能换一种写法 ...