04 Mar 2019
规则模式
规则模式是一种特殊的命令模式
evaluator负责聚合评估规则,而每个具体规则只负责实现自己的规则和匹配。
使用场景
- 当系统内的条件判断复杂度上升,同样性质的增量改变是可预料的
- 系统会考虑选择哪些操作是适用的,并执行这些操作
- 系统需要支持用户创建的逻辑来决定何时以及如何应用操作
业务规则引擎
- 用于封装业务规则的软件系统
- 通常支持业务用户编写规则
- 存储在数据库或文件系统中的规则
- .NET 里有 System.Workflow 包含 Rules Engine
...
04 Mar 2019
代理模式
使用场景
- remote 远程代理。为一个对象在不同地址空间提供局部代表;
- virtual 虚拟代理。对象创建的开销很大的时候,用代理去lazy loading;
- protection 安全代理。控制真实对象的访问权限,即在访问一个对象时附加一些内务处理。
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;
}
}
相关模式
-
适配器模式:适配器改变对象的接口来满足客户端的需要。代理模式保留接口不变,控制访问对象底层行为。
-
装饰器模式:实现方式与代理模式很像,但是目的不同。装饰器给对象附加上责任,但是代理控制对象的访问。
...
04 Mar 2019
原型模式
用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。
一般在初始化的信息不发生变化的情况下,克隆是最好的办法。既可以隐藏对象创建的细节,又对性能大大提提高。
- memento对象只负责存储状态(value objects)。
- caretaker负责管理memento堆栈,保存originator的状态以及供其恢复堆栈内存储的状态。
- 只有originator可以创建或恢复它的状态。
把数据结构和对其的操作解耦,使得操作可以自由地添加。
ObjectStructure枚举需要被访问者操作的元素,枚举时每个element accept visitor就是在传入visitor并使其在其中调用逻辑方法。
场景示例
- 构造函数实例化对象代价较高
- 对象内部各状态都很重要
- 隐藏了构造函数(internal constructor)
注意
- this.MemberwiseClone()是浅拷贝(非静态字段),引用类型只能拷贝引用。
- 如果要深拷贝,可以先将引用类型参数对象的类实现C#Icloneable接口,然后在引用它的对象的Clone()方法里将它clone出来,然后再一个个复制其余值类型。
...
04 Mar 2019
空对象模式
一种null检查的替代。为可能出现null的类单独实现一个null的子类,为其实现所需的方法。
AKA Stub, Active Nothing, Active Null
常被实现为一个单例,没有随实例变化的行为或状态;
目的
- 摆脱null检查的逻辑;
- 提供无方法对象来代替null 引用;
- 允许方法被null对象调用,null 引用就不行。
关联的模式
- 单例模式
- 策略模式
- 命令模式
- 状态模式
- others
优点
- code更加干净简洁;
- 更少的null检查;
- 更少的分支,意味着更低的复杂度;
- 调用者无需关心到底得到的是真对象还是空对象;
- 必须让其他的开发人员知道某处实现了空对象。
...