04 Mar 2019
迭代器模式
当你需要遍历访问聚集对象,可以有多种遍历方式时,应该考虑使用迭代器模式。
迭代器模式,分离了集合对象的遍历行为,抽象出一个迭代器类来负责遍历, 这样即可以做到不暴露集合内部结构,又可以让外部代码透明地访问集合内部数据。
aggregate(collection)负责收集聚合数据,然后交给iterator去操作遍历。
.NET的自带接口
实现了这两个接口IEnumerator & IEnumerable,就可以使用foreach关键字来遍历集合对象。
public interface IEnumerator
{
object Current
{
get;
}
bool MoveNext();
void Reset();
}
public interface Ienumerable
{
IEnumerator GetEnumerator();
}
相关模式
- 工厂模式:
- 迭代器可以通过aggregate中的工厂方法创建
- 多态迭代器使用工厂方法实例化适当的迭代器子类
- 组合模式:
...
04 Mar 2019
解释器模式
如果一种特定类型的问题发生频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。
当有一个语言(DSL)需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。设计迷你语言,解释迷你语言。但当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。
简单工厂加反射可以避免对switch case的修改,从而不用修改代码。
相关模式
组合模式
...
04 Mar 2019
享元模式
用共享技术有效地支持大量细粒度的对象。
使用场景
- 程序使用了大量的对象,造成了很大的存储开销;
- 对象的大多数状态可以实现为外部状态(作为参数),这样可以从类中抽出外部状态,用相对较少的共享对象取代很多组对象(棋子的类型为内部状态,所在棋盘的位置为外部状态)
目的
- 减少大量细粒度对象存储开销;
- 同时共享要在多个上下文中使用的对象;
- 保持面向对象的粒度和灵活性;
关联的模式
- 组合模式(叶节点可被实现为享元)
-
策略模式(算法可被实现为享元)
- 状态模式
...
04 Mar 2019
Tips
可以用 反射技术+config 来去除分支判断逻辑带来的耦合 :
static IAutoFactory LoadFactory()
{
string factoryName = Properties.Settings.Default.AutoFactory;
return (IAutoFactory)Assembly.GetExecutingAssembly().CreateInstance(factoryName);
}
动机
- 不确定接口的哪个具体实现来返回
- 对象的创建和表达需要分开
- 很多if/switch 来决定创建哪个具体的class
目的
- 把对象的实际创建从对象创建的选择逻辑中分离出来
- 添加新的类和功能(生产工厂的类,工厂类),而不打破开闭原则
- 把对象选择存在程序之外(DB or config)
简单工厂模式
把类的实例化放在工厂内部的选择逻辑里。调用类知道它需要的具体工厂,直接用工厂实例的函数来返回所需的产品实例,这样就去除了客户端和具体产品的依赖。
...
04 Mar 2019
外观模式
Tips
目的:解耦,使子系统间减少依赖。
封装集成一些繁杂的功能为一层包装类,使客户端使用起来更加方便。
- 设计初期应该将不同的两个层分离,层间使用facade为复杂子系统提供简单接口。
- 为设计粗糙或高度复杂的遗留代码设计简单的facade接口,这样新系统就解耦地使用遗留代码。
相关模式
...