^

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

Rules Pattern

规则模式

规则模式是一种特殊的命令模式

evaluator负责聚合评估规则,而每个具体规则只负责实现自己的规则和匹配。

rule

使用场景

  • 当系统内的条件判断复杂度上升,同样性质的增量改变是可预料的
  • 系统会考虑选择哪些操作是适用的,并执行这些操作
  • 系统需要支持用户创建的逻辑来决定何时以及如何应用操作

业务规则引擎

  • 用于封装业务规则的软件系统
  • 通常支持业务用户编写规则
  • 存储在数据库或文件系统中的规则
  • .NET 里有 System.Workflow 包含 Rules Engine
...
more »

Proxy Pattern

代理模式

使用场景

  1. remote 远程代理。为一个对象在不同地址空间提供局部代表;
  2. virtual 虚拟代理。对象创建的开销很大的时候,用代理去lazy loading;
  3. protection 安全代理。控制真实对象的访问权限,即在访问一个对象时附加一些内务处理。

proxy

proxy2

lazy loading

在真正需要的时候才去loading数据,其余时候只用继承自同一基类的proxy类。在proxy类中实现需要被访问的字段数据的lazy loading property, 如:

_items = new Lazy<List<OrderDetails>>(() => new OrderDetails());

或者通过flag 字段来实现:

public override List<OrderDetails> Items
{
    get
    {
        return GetItems();
    }
}

protected override List<OrderDetails> GetItems()
{
    if (!_itemsLoaded)
    {
        GetEntity();
        _orderDetails = base.GetItems();
        _itemsLoaded = true;
    }
    return _orderDetails;
}

A sample of protection type

此例将proxy模式加入到仓库模式中去实现cache,提升了仓库模式的性能。

CachedOrderRepository作为proxy继承自RemoteOrderRepository(连接数据库,提供数据)。CachedOrderRepository类override了父类的getData方法,并在其中附加一些内务处理(此处是运用container来实现数据缓存):

using System.Runtime.Caching;

public class CachedOrderRepository : RemoteOrderRepository
{
    public override OrderEntity GetById(int id)
    {
        string cacheKey = "OrderEntity-" + id;
        var entity = MemoryCache.Default[cacheKey] as OrderEntity;
        if(entity == null)
        {
            entity = base.GetById(id);
            var cacheItem = new CacheItem(cacheKey, entity);
            var policy = new CacheItemPolicy();
            MemoryCache.Default.Add(cacheItem, policy);
        }
        return entity;
    }
}

相关模式

  1. 适配器模式:适配器改变对象的接口来满足客户端的需要。代理模式保留接口不变,控制访问对象底层行为。

  2. 装饰器模式:实现方式与代理模式很像,但是目的不同。装饰器给对象附加上责任,但是代理控制对象的访问。

...
more »

Prototype Pattern

原型模式

用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。

一般在初始化的信息不发生变化的情况下,克隆是最好的办法。既可以隐藏对象创建的细节,又对性能大大提提高。

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

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

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

prototype.png

场景示例

  1. 构造函数实例化对象代价较高
  2. 对象内部各状态都很重要
  3. 隐藏了构造函数(internal constructor)

注意

  1. this.MemberwiseClone()是浅拷贝(非静态字段),引用类型只能拷贝引用。
  2. 如果要深拷贝,可以先将引用类型参数对象的类实现C#Icloneable接口,然后在引用它的对象的Clone()方法里将它clone出来,然后再一个个复制其余值类型。
...
more »

Observer Pattern

观察者模式

特征

  • 系统被分割成相互协作的很多类,但我们不希望为了维护相关对象间的一致性,而去使各类紧密耦合。

  • 观察者模式所做的工作是解除耦合,让耦合双方依赖抽象,而非具体,从而使得各自的变化都不会影响另一方的变化。
  • 多抽象,少具体可以降低耦合。(依赖倒转原则)
  • 具体观察者可能并不属于同一基类,所以可以使用抽象接口来统一他们,都能实现update方法就行。
  • delegate可以看做是对函数的抽象,是函数的‘类’,委托的实例将代表一个具体函数。
  • 委托所搭载的方法并不需要属于同一类,但方法接口参数要相同。

observer

...
more »

Null Object Pattern

空对象模式

一种null检查的替代。为可能出现null的类单独实现一个null的子类,为其实现所需的方法。

AKA Stub, Active Nothing, Active Null

常被实现为一个单例,没有随实例变化的行为或状态;

目的

  1. 摆脱null检查的逻辑;
  2. 提供无方法对象来代替null 引用;
  3. 允许方法被null对象调用,null 引用就不行。

关联的模式

  • 单例模式
  • 策略模式
  • 命令模式
  • 状态模式
  • others

优点

  • code更加干净简洁;
  • 更少的null检查;
  • 更少的分支,意味着更低的复杂度;
  • 调用者无需关心到底得到的是真对象还是空对象;
  • 必须让其他的开发人员知道某处实现了空对象。

null

...
more »