^

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

Iterator Pattern

迭代器模式

当你需要遍历访问聚集对象,可以有多种遍历方式时,应该考虑使用迭代器模式。

迭代器模式,分离了集合对象的遍历行为,抽象出一个迭代器类来负责遍历, 这样即可以做到不暴露集合内部结构,又可以让外部代码透明地访问集合内部数据。

aggregate(collection)负责收集聚合数据,然后交给iterator去操作遍历。

iterator

.NET的自带接口

实现了这两个接口IEnumerator & IEnumerable,就可以使用foreach关键字来遍历集合对象。

public interface IEnumerator
{
    object Current
    {
        get;
    }
    bool MoveNext();
    void Reset();
}

public interface Ienumerable
{
    IEnumerator GetEnumerator();
}

相关模式

  • 工厂模式:
    • 迭代器可以通过aggregate中的工厂方法创建
    • 多态迭代器使用工厂方法实例化适当的迭代器子类
  • 组合模式:
    • 迭代器可被用来递归遍历组合结构,如树。
...
more »

Interpreter Pattern

解释器模式

如果一种特定类型的问题发生频率足够高,那么可能就值得将该问题的各个实例表述为一个简单语言中的句子。

当有一个语言(DSL)需要解释执行,并且你可以将该语言中的句子表示为一个抽象语法树时,可使用解释器模式。设计迷你语言,解释迷你语言。但当文法非常复杂时,使用其他的技术如语法分析程序或编译器生成器来处理。

简单工厂加反射可以避免对switch case的修改,从而不用修改代码。

interpreter

相关模式

组合模式

...
more »

Flyweight Pattern

享元模式

用共享技术有效地支持大量细粒度的对象。

使用场景

  1. 程序使用了大量的对象,造成了很大的存储开销;
  2. 对象的大多数状态可以实现为外部状态(作为参数),这样可以从类中抽出外部状态,用相对较少的共享对象取代很多组对象(棋子的类型为内部状态,所在棋盘的位置为外部状态)

目的

  1. 减少大量细粒度对象存储开销;
  2. 同时共享要在多个上下文中使用的对象;
  3. 保持面向对象的粒度和灵活性;

关联的模式

  • 组合模式(叶节点可被实现为享元)
  • 策略模式(算法可被实现为享元)

  • 状态模式

flyweight

...
more »

Factory Pattern

Tips

可以用 反射技术+config 来去除分支判断逻辑带来的耦合 :

static IAutoFactory LoadFactory()
{
    string factoryName = Properties.Settings.Default.AutoFactory;
    return (IAutoFactory)Assembly.GetExecutingAssembly().CreateInstance(factoryName);
}

动机

  1. 不确定接口的哪个具体实现来返回
  2. 对象的创建和表达需要分开
  3. 很多if/switch 来决定创建哪个具体的class

目的

  • 把对象的实际创建从对象创建的选择逻辑中分离出来
  • 添加新的类和功能(生产工厂的类,工厂类),而不打破开闭原则
  • 把对象选择存在程序之外(DB or config)

简单工厂模式

把类的实例化放在工厂内部的选择逻辑里。调用类知道它需要的具体工厂,直接用工厂实例的函数来返回所需的产品实例,这样就去除了客户端和具体产品的依赖。

...
more »

Facade Pattern

外观模式

Tips

目的:解耦,使子系统间减少依赖。

封装集成一些繁杂的功能为一层包装类,使客户端使用起来更加方便。

  1. 设计初期应该将不同的两个层分离,层间使用facade为复杂子系统提供简单接口。
  2. 为设计粗糙或高度复杂的遗留代码设计简单的facade接口,这样新系统就解耦地使用遗留代码。

相关模式

...
more »