大话设计模式-程杰

源码地址:http://www.cnblogs.com/Files/cj723/BigTalkDesignPattenSourceCode.rar

书的前面介绍了很多著作: 《设计模式:可复用面向对象软件的基础》(GOF的ERICH Gamm,Richard Helm, Ralph Johnson, John Vlissides) 《设计模式解析》(Alan Shalloway, James R. Trott) 《敏捷软件开发:原则、模式与实践》(Robert C.Martin) 《重构--改善既有代码的设计》(Martin Fowler) 《重构与模式》(Joshua Kerievsky) 《Java与模式》(阎宏) 《Head first design patterns》(eric freeman)

语言是c#

前面讲的还好,后面的有点扯的

分类

创建型

抽象工厂,建造者,工厂方法,原型模式,单例模式

结构型

适配器,桥接,组合,装饰,外观,享元,代理

行为型

观察者,模板方法,命令,状态,职责链, 解释器,中介者,访问者,策略,备忘录,迭代器

简单工厂模式

就是使用判断语句 来根据输入信息,得到对应的输出信息。 然后封装到单一的方法内部,不需要让调用者知道具体细节。

这样调用者还是需要知道工厂方法和输出信息。如:

int a = 1;
int b = 2;
String operate = "/";

OperatorFactory.getOperator(operate).process(a, b);

策略模式

int a = 1;
int b = 2;
String operate = "/";
//不一定要工厂嘛
Strategy strategy = StrategyFactory.getStrategy(operate);

new OperatorStrategy().setStrategy(strategy).do(a, b);
//当然可以在构造中直接进行
new OperatorStrategy(strategy).do(a, b);

不过可以把工厂方法放在策略类内部,而不单独建立工厂类 同时输出信息就是策略类本身 这样调用方就只需要知道一个输出信息。

new OperatorStrategy().setStrategyByOperate(operate).do(a, b);

装饰模式

//被装饰者
ConcreteComponent cc = new ConcreteComponent();
//装饰1
DecoratorComponent.ComponentA ca = new DecoratorComponent.ComponentA();
//装饰2
DecoratorComponent.ComponentB cb = new DecoratorComponent.ComponentB();
//装饰1持有被装饰者,并和被装饰者的行为统一
ca.setComponent(cc);
//装饰者2持有被装饰者1,行为统一
cb.setComponent(ca);
//最后一个装饰者调用统一的行为
cb.decoratorOperate();

DecoratorComponent通过setComponent 持有被装饰者,然后可以进行修饰行为 当然在构造函数中直接设置可以让调用看起来更加爽快

cb(ca(cc)).decoratorOperate();

代理模式

//不管是什么形式,proxyPursuit.doPursuit() 都将pursuit和target关联起来
//事件流
Target target = new Target();
ProxyPursuit proxyPursuit = new ProxyPursuit();
proxyPursuit.knowTarget(target);

Pursuitor pursuitor = new Pursuitor();
pursuitor.setProxy(proxyPursuit);

pursuitor.doPursuit();

//代码流
Target target = new Target();
Pursuitor pursuitor = new Pursuitor();
ProxyPursuit proxyPursuit = new ProxyPursuit();
proxyPursuit.knowTarget(target);
proxyPursuit.setFrom(pursuitor);

proxyPursuit.doPursuit();

工厂方法模式

让子类决定实例化哪一种示例,用接口统一化实现

相对于简单工厂而言,不违背OCP。

原型模式

用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。 java里就是clone

模板模式

利用java的多态,抽象类设计抽象方法即可。。。

外观模式

定义一个高层接口,屏蔽了对一系列低层接口的细节操作 (就是统一操作?)

建造者模式

需要构建顺序稳定的情况。 先创建一个抽象类,然后用一个辅助类持有引用,并在创建方法中设定创建过程。

Director director = new Director();
Builder b1 = new Builder1();//需要构建的部分
director.build(b1);//控制Builder接口的调用顺序
b1.getResult().display();

这种形式感觉没有Android Dialog.Builder的顺畅

观察者模式

常规观察者模式比较简单,一方持有观察者的列表,通知时遍历即可。最多抽取一下接口 但是对于现有的代码结构,可能不能都继承这样的接口,即行为不统一。 此时需要使用方法委托,而java的方法委托实际上是用反射实现的,参看EventHandler

抽象工厂模式

在需要配置 多个总组件,而每个组件下面又有基本一样的组件结构的时候。 可以考虑这种模式,甚至加上反射来简化。 (其实感觉平时写的时候,只要追求抽象,在业务逻辑有这种需要时,总能写出来这样的代码。)

状态模式

状态有序化

适配器模式

持有转化

备忘录模式

虽然clone有类似的效果,但是定制性不高。建议自己写一个需要的状态存储类 提了下命令模式。。又讲到下面去了。。

组合模式

树状依赖 透明方式:把非共有的方法也定义在抽象接口,在实现时如不需要则不进行操作 安全方式:把共有的方法抽象,而非共有的方法在需要的地方添加。

迭代器模式

foreach 咯

单例模式

桥接模式

有点莫名其妙的。。。把一个东西的多个维度,如有需要,抽取维度为独立的部分,被总体持有。

命令模式

感觉就是把一些被调用方的判断抽取成对应的类,和工厂方法模式有的一拼? 然后加个中间类进行控制,让被调用方对于调用方而言,更加直白。

职责链模式

链式请求,队列。。。

中介者模式

就是增加了中间类,持有所有需要交互的平级类。平级类又持有中间类,进行交互。 感觉加一些东西就是命令模式了。。。

享元模式

还是通过第三者存储,然后处理统一接口 主要目的是为了共享对象,当然也可以不共享(个人觉得这是基本操作吧?谈不上模式?) 如果有不能共享的数据,考虑从外部传入。。

解释器模式

接口设置不同的解释器,然后通过接口方法统一执行。层层过滤。。没了。。。 真的感觉后面的这些模式没啥差别啊。。。

访问者模式

很多时候,主体有确定数量的类别,但有很多属性。如果正常的设计,需要实例化不同类别的主体,再增加对应的属性。 而修改的可能性很高,且涉及到主体的多次修改。。。。 这个时候可以反其道而行,按属性抽象;同时将属性赋值给主体的同时,调用主体的对应方法,可以把属性的行为封装起来。 这样修改的时候,只需要添加属性具体类,并放入较少的主体信息即可。

Last updated

Was this helpful?