三言两语说设计模式
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都算节点的要素
| 类别 | 侧重于 | 名称 | 
| 名称 | ||
| 类别 | 侧重于 | 名称 | 
                    
                
                
            
        
浙公网安备 33010602011771号