三言两语说设计模式

23种设计模式(1995年出版,那时候还没有java,c#)与其说是设计模式,不如说23招。招数是固定套路。

 

本文I=interface I
创建型

Singleton(单例模式)

【核心】:保证一个类只有一个实例,并提供一个访问它的全局访问点

例子:string.Empty(固定值),HttpContext.Current

class A{

  class A_Empty:A{...}

  public static readonly Special=B.CreateA();//1.交其他静态对象创建

  public static readonly Current;

  public static readonly Default=new A();

  public static readonly Empty=new A_Empty();

  static A(){

    Current=//2.通过反射配置取值

  }

}

简单工厂:又称静态工厂模式,没列为设计模式

【核心】:自己搞定产品创建

列举了常见几种创建方式。

class F1{

  Dictionary<Type,A>dict;

  A create(){return new A1();}

  A create(string key){switch(key)...return new A1();return new A2();}

  A create(Type t 或string/int){

    var o=Activator.CreateInstance(t);

    var o=dict[t];

    return o;

    return o.Clone();

  }

}

Factory Method(工厂模式)

【核心】:后代实现创建。也就是说先挂个号,反正会有人给你要的东西。

IFactory<T>{

  T create();

}
Abstract Factory(抽象工厂模式)

【核心】:创建一系列相互依赖(或关系紧密)的不同类别对象,规避各自独立创建关联对象时会带来的耦合依赖。

例:IFactory{

  A CreateA();

  B CreateB();

}
 
Builder(生成器模式):复杂产品各部件变化大,但生产过程(算法)相对稳定,

区别于抽象工厂:抽象工厂关注产品的耦合性。builder创建算法稳定。
Prototype(原型模式):js里的prototype


结构型 (类的组织方法)
Adapter(适配器模式) :将一个类的接口转换成客户希望的另外一个接口。兼容现存无法修改的对象。
Bridge(桥接模式):抽象对象的修改、不同的实现,二者分离,各自独立变化。

abstraction class A1{

  property p1;

  Implementor1 imp1;

  Implementor2 imp2;

}

abstraction class A2:A1{

  property p2;

}

Implementor1{

  do1();

}

Composite(组合模式):将对象表现成"树"状结构。
Decorator(装饰模式)(包装):包装类继承原始类,并包含原始类的引用,装饰效果在包装类之后产生。

功能的扩展可以在预料之外。

例:装饰以帽子,衣服,项链
Facade(外观模式,门面模式):子系统打包,简化接口使得操作简单。

Flyweight(享元模式) :运用共享技术有效地支持大量细粒度的对象。

如:页面里如果不共享,每个按钮,文本框都需要有字体对象。而我期望当只有3种字体时只有3个对象。通过查找来解决。

Proxy(代理模式):用貌似的东西仿冒真实对象。比如用1个矩形框代理一个复杂图形,以移动缩放等。


行为型
Chain of Responsibility(职责链模式):我把事情交给了皮球公司,我也不知道被谁处理了
Command(命令模式):把一个行为包装成1个对象。前提必须有管理行为的必要,否则典型的自虐。

一般会有个接受者(命令管理器)

ICommand{

  ICommandManager receiver;

  exec();

}

class Cmd1:ICommand{

  receiver=new UndoManager();

  exec(){...   receiver.accept(this);  }

}

class UndoManager:ICommandManager

{

  Stack<ICommand>stack;

  void accept(ICommand cmd){

    stack.push(cmd);

  }

}

Interpreter(解释器模式)
Iteartor(迭代器模式) :foreach
Mediator(中介者模式):用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。随着被封装对象交互的增加会降低重用性。

【俺】封装乌七八糟没有规律的行为


Memento(备忘录模式):在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。

【俺】替换成另一实体,并持续变化。外部维护历史状态,并隐藏实现细节。


State(状态模式):允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

【俺】替换成代表了不同特性+行为的实体。实体可以id化。


Strategy(策略模式):策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法独立于使用它的客户而独立变化。

【俺】替换成具备相同行为的实体。

 

Observer(观察者模式):.net事件

 

TemplateMethod(模板方法模式) :顾名思义

例:Page的初始化阶段

{

  OnPreInit()

  OnInit();..

  OnPreLoad();

  OnLoad();

  OnLoadComplete();

}
Visitor(访问者模式):通过访问对象的不同组成部分,来保证一致性

IVisitor{

  visitAttribute(string key);

  visitNode(node);

  visitTextNode()

}

 attr,node都算节点的要素

 

类别 侧重于 名称
名称
类别 侧重于 名称

posted on 2010-06-19 01:48  zmodem  阅读(295)  评论(0)    收藏  举报

导航