^

Young Anything I do that may help others, I'll post it here.

Memento Pattern

备忘录模式

在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可以将该对象恢复到原先保存的状态。

  • memento对象只负责存储状态(value objects)。
  • caretaker负责管理memento堆栈,保存originator的状态以及供其恢复堆栈内存储的状态。
  • 只有originator可以创建或恢复它的状态。

把数据结构和对其的操作解耦,使得操作可以自由地添加。

ObjectStructure枚举需要被访问者操作的元素,枚举时每个element accept visitor就是在传入visitor并使其在其中调用逻辑方法。

memento

注意

  1. 相较于存储状态,一种变形是,存储反转操作。如:操作(+5),那就存储操作(-5)。
  2. 有些场景的反转操作并不能得到之前的结果,如:图计算,翻译。
...
more »

Mediator Pattern

中介模式

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互作用,从而使其耦合松散,而且可以独立地改变他们间的交互。

优点

Mediator的出现减少了各个Colleague的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。

把对象如何协作进行了抽象,将中介作为一个独立的概念封装在对象中,关注的对象就从对象各自本身的行为转义到他们之间的交互上来,是从一个更为宏观的角度看待系统。

缺点

当系统出现‘多对多’交互复杂的对象群时,不要急于使用中介者模式,而是烦死系统在设计上是否合理。

由于ConcreteMediator控制了集中化,浴室就把交互复杂性转变为了中介者复杂性,这就使ConcreteMediator比任何一个ConcreteColleague都复杂。

Builder-Pattern

...
more »

Model View ViewModel Pattern

Model View ViewModel模式

需要依赖WPF/Silverlight来实现,即只适用于这两个框架。

大体上和MVP类似:

MVVM

  1. Model: the data;
  2. View: Binding to ViewModel set by the DataContext;
  3. ViewModel:
    • Exposes the Model as Properties or Commands
    • Must implement INotifyPropertyChanged

优缺点

优点:

  • 减少code-Behind;
  • Model不需要为了支持View去更改;
  • 前端页面设计,和后端业务逻辑分离;
  • 减少开发时间;
  • Multi-targeting(project linking) : support .net multi-framework

缺点:

  • 创建了更多的文件;
  • 简单的任务可能实现上也比较复杂;
  • 缺少标准化;
  • 特定地适用于WPF、Sliverlight平台;

相关模式

  • Model View Presenter(MVP)
  • Model View Controller(MCV)
  • Presentation Model(PM)
...
more »

Model View Presenter Pattern

Model View Presenter 模式

view 和 presenter 相互绑定,view负责关联html内部的函数和变量。presenter 负责把view传给他的args和调用的model作为参数传入自己绑定的view 的函数中。

  • view 直接和html关联交互
  • presenter (aka controller)和view相互绑定,然后view在需要展示时传参调用presenter 的相关函数,这些函数再运用具体的逻辑去取需要的model传入view的函数去渲染展示
  • model只负责为presenter 提供数据
  • 这样就形成了很好的分离解耦 :view只负责展示,presenter只负责业务逻辑,model只负责提供数据

目的

  • 职责分离
    • 需要展示的数据 Model
    • 业务逻辑 presenter
    • 展示数据 view
  • 使模式中这些合作者(MVP)能单独测试
  • 比查找业务逻辑更具可读性和可维护性

MVP

...
more »

Lazy load Pattern

Lazyload模式

常见场景
  1. property初始化用Lazy关键字去set,get方法通过Lazy对象.value去真正赋上值;
  2. virtual proxy,就是利用1中的概念,在开销大的property真正被call的时候才去为其赋值;
  3. value holder同理2;
  4. ghost就是field不完全被赋值状态的对象,一旦被调用其中的某个field就:该load上value的就set上value,暂时还没必要的就set上Lazy
...
more »