编程知识 购物 网址 新闻 笑话 | 软件 日历 阅读 图书馆 China
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
vbs/VBScript DOS/BAT hta htc python perl 游戏相关 VBA 远程脚本 ColdFusion ruby专题 autoit seraphzone PowerShell linux shell Lua Golang Erlang 其它教程 CSS/HTML/Xhtml html5 CSS XML/XSLT Dreamweaver教程 经验交流
站长资讯 .NET新手 ASP.NET C# WinForm Silverlight WCF CLR WPF XNA VisualStudio ASP.NET-MVC .NET控件开发 EntityFramework WinRT-Metro Java C++ PHP Delphi Python Ruby C语言 Erlang Go Swift Scala R语言 Verilog 其它语言 架构设计 面向对象 设计模式 领域驱动 Html-Css JavaScript jQuery HTML5 SharePoint GIS技术 SAP OracleERP DynamicsCRM K2 BPM 信息安全 企业信息 Android开发 iOS开发 WindowsPhone WindowsMobile 其他手机 敏捷开发 项目管理 软件工程 SQLServer Oracle MySQL NoSQL 其它数据库 Windows7 WindowsServer Linux
   -> 领域驱动设计 -> 设计模式 -> 正文阅读

[领域驱动设计]设计模式

备忘录模式C++实现 1定义Memento pattern
在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先的状态
2类图


3实现
class Originator
{
private:
  string state;
public:
  string getState();
  void setState(string &x);
  Memento creatMemento()
  {
    return new Memento(state);
  }
  void restoreMemento(Memento men)
  {
    setState(men.getState());
  }
};
class Memento
{
public:
  Memento(string st)
    :state(st)
  {}
  string getState()
  {
    return state;
  }
  void setState(string st)
  {
    state = st;
  }
};
//备忘录管理员角色
class Caretaker
{
private:
  Memento memento;
  Memento getMemento()
  {return memento;}
  void setMemento(string st)
  {memento = st;}
};
class Client
{
public:
  void operator()()
  {
    Originator or= new Originator();
    Caretaker ca = new Caretaker();
    //管理员备忘记录设置为用户定义为备忘状态
    ca.setMemento(or.createMemento());
    //用户重新会退到管理员记录的某一状态
    or.restoreMemento(ca.getMemento());
  }
};
4应用
使用场景
需要提供保存和恢复数据的相关状态场景
提供一个可回滚rollback操作
需要监控的副本场景。
数据库连接的事务管理就是备忘录模式
注意事项:
备忘录的声明期:作用在最近的代码。不使用就立即删除。..备忘录不是华佗在世,起死回生
备忘录的性能:不能用在for中,不能用频繁建立。消耗资源太多,这会是设计重构的前兆
5扩展
clone方式的备忘录


实现
class Originator :public Cloneable
{
private:
  string state;
public:
  void setState(string st);
  Originator creatorMemento()
  {
    return clone();
  }
  restoreMemento(Originator or)
  {
    setState(or.getState);
  }
  
  Originator clone()
  {
    //其实就是拷贝构造一个
  }
};
class Caretaker
{
private:
  Originator or;
  Originator getOriginator()
  {
    return or;
  }
  void setOriginator(Originator originator)
  {
    or = originator;
  }
}
既然可以合并备忘录角色,那么管理员也是可以合并的

class Originator :public Cloneable
{
private:
  Originator* _backup;
  string _state;
public:
  Originator(const Originator& or)
  {} 
  void setState();
  void creatMemento()
  {
    _bcakup = new Originator(*this);
  }
  void restoreMemento()
  {
    assert(_backup);
    setStat(_backup->getState);
  }
};
注:因为clone方式的备忘录可能会因为深浅拷贝问题而复杂,所以clone方式的备忘录适用简单的场景
②多状态备忘录
在Originator中封装多个状态,而Memento则保存一个HashMap 的state
③多备份的备忘录
注:管理员角色封装一的HashMap封装一个备忘录而非备忘状态
eg
class Caretaker
{
private:
  HashMap<string,Memento> memMap;
public:
  Memento getMemento(stirng index)
  {}
  void setMemento(string index,Memento me)
  {
    memMap.put(index,me);
  }
};
void Test
{
  Originator or = new Originator();
  Caretaker ca = new Caretaker();
  ca.setMemento("001",or.createMemento());
  ca.setMemento("002",or.createMemento());
  or.restoreMemento(ca.getMemento("001"));
}
注:该模式下应当注意备忘录上限,控制内存
提升:提供权限问题
class Originator
{
private:
  string state;
public:
  void setState(string st);
  Imemento createMemento()
  {
    return new Memento(state);
  }
  void restoreMemento(Imemento me)
  {
    setState(me.getState());
  }
private:
  //内置类,实现
  class Memento :public IMemento
  {
  private:
    string state;
    Memento(string st)
    {
      state = st;
    }
    string getState();
    void setState(string st);
  };
};
class Imemento
{
public: 
  virtual ~Imemento()=0;
};
class Caretaker
{
  Imemento memento;
public:
  Imemento getMemento()
  {
    return memento;
  }
  void setMemento(Imemento mem)
  {
    memento = mem;
  }
};
注:这里的设计方案:双接口设计,一个是业务的正常接口,实现必要的业务逻辑,宽接口;另一个则是空接口,什么方法都没有,目的是提供给子系统外的模块访问,窄接口。窄接口中没有任何操纵数据的方法,所以是相对安全的。
  领域驱动设计 最新文章
领域驱动设计的基础知识总结
海西 · 云交付 DevOps实践落地方案
多服务器终端交互利器
《静儿的服务治理私房菜》服务治理和架构
服务治理概述
美团.点评服务治理框架
ASP.NET Zero
1.领域驱动简介.2.领域.子域.限界上下文.3.
东麓庄园系统开发
东麓庄园系统开发
上一篇文章      下一篇文章      查看所有文章
加:2016-04-11 01:10:38  更:2017-05-16 03:46:46 
 
360图书馆 软件开发资料 购物精选 新闻资讯 Chinese Culture 三丰软件 开发 中国文化 阅读网 日历 万年历 2019年10日历
2019-10-19 21:37:32
多播视频美女直播
↓电视,电影,美女直播,迅雷资源↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  编程知识