CSDN博客

img redvalley

设计模式笔记

发表于2004/10/19 19:49:00  922人阅读

分类: T

  • 创建模式
  • 结构模式
  • 行为模式

1.Factory Method 工厂方法
        创建对象与使用对象责任分离。
        1)简单工厂
        2)工厂方法
        3)抽象工厂

2.Builder 创建模式
        将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
        局部创建
        解耦过程和部件

3.Prototype 原型
        用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
        Prototype模式允许一个对象再创建另外一个可定制的对象,根本无需知道任何如何创建的细节。
        工作原理是:通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
        clone:深度克隆

4.Singleton 单例
        确保一个类只有一个实例。
        使用场合:对资源的控制。eg 数据库连接池,系统参数配置,Java API 中的 Runtime, Calendar...
        实现方式:
                1)懒汉模式:
                    double-checked locking (DCL)--多线程资源可剥夺。
                    多个类加载器加载使单例可能失效。
                2)非懒汉模式:推荐。


5.Adapter 适配器
        将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份。
        组合(composition)和继承(inheritance).
        java不支持多继承,可用接口实现。

6.Bridge 桥接模式
        将抽象和行为划分开来,各自独立,但能动态的结合。

7.Composite 组合
        将对象以树形结构组织起来,以达成“部分-整体” 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性。
        Composite比较容易理解,想到Composite就应该想到树形结构图。组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行。可以用牵一动百来形容。
        首先定义一个接口或抽象类,这是设计模式通用方式了,其他设计模式对接口内部定义限制不多,Composite却有个规定,那就是要在接口内部定义一个用于访问和管理Composite组合体的对象们(或称部件Component).

8.Decorator 装饰模式
        动态给一个对象添加一些额外的职责。
        eg,
        1)IO: BufferedReader br = new BufferedReader(new FileReader(filename));
        2)扩展awt、swing组件。
        ...


9.Facade 外观
        为子系统中的一组接口提供一个一致的界面。
        Facade一个典型应用就是数据库JDBC的应用。


10.Flyweight 享元模式
        内部状态:intrinsic
        外部状态:extrinsic
        共享内部状态元,由Flyweight Factory(享元工厂)管理Flyweight Pool(元池)。

11.Proxy 代理模式
        为其他对象提供一种代理以控制对这个对象的访问。
        使用情况:
                1)授权机制 不同级别的用户对同一对象拥有不同的访问权利。
                2)某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动。
                3)copy-on-write的优化方式
        动态代理,eg:代理JDBC Connection,截取close方法,返回连接池(简单强大但耗资源)。



12.Observer 观察者模式
        类似监听器,通过接口回调。


13.Memento 备忘机制
        存另外一个对象内部状态拷贝的对象,这样以后就可以将该对象恢复到原先保存的状态。
        可作历史记录,耗资源(如果可以结合享元模式节省开支)。

14.State 状态模式
        使用状态模式前,客户端外界需要介入改变状态,而状态改变的实现是琐碎或复杂的。
        使用状态模式后,客户端外界可以直接使用事件Event实现,根本不必关心该事件导致如何状态变化,这些是由状态机等内部实现。
        这是一种Event-condition-State,状态模式封装了condition-State部分。
        每个状态形成一个子类,每个状态只关心它的下一个可能状态,从而无形中形成了状态转换的规则。如果新的状态加入,只涉及它的前一个状态修改和定义。
        状态转换有几个方法实现:一个在每个状态实现next(),指定下一个状态;还有一种方法,设定一个StateOwner,在StateOwner设定stateEnter状态进入和stateExit状态退出行为。

15.Command 命令模式
        将命令封装在一个类中,然后用户(调用者)再对这个类进行操作。
        使用Command模式的一个好理由还因为它能实现Undo功能,每个具体命令都可以记住它刚刚执行的动作,并且在需要时恢复。


16.Chain of Responsibility 职责链
        简称CoR.
        用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request。
        CoR的优点:
                因为无法预知来自外界的请求是属于哪种类型,每个类如果碰到它不能处理的请求只要放弃就可以。无疑这降低了类之间的耦合性。
                缺点是效率低,因为一个请求的完成可能要遍历到最后才可能完成,当然也可以用树的概念优化。 在Java AWT1.0中,对于鼠标按键事情的处理就是使用CoR,到Java.1.1以后,就使用Observer代替CoR。
                扩展性差,因为在CoR中,一定要有一个统一的接口Handler,局限性就在这里。
        与Command模式区别:
                Command 模式需要事先协商客户端和服务器端的调用关系,比如 1 代表 start 2 代表 move 等,这些 都是封装在 request 中,到达服务器端再分解。
                CoR 模式就无需这种事先约定,服务器端可以使用 CoR 模式进行客户端请求的猜测试验。

17.Template 模板模式
        定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中。
        Java的抽象类本来就是Template模式。

18.Strategy 策略
        定义一系列的算法,把这些算法一个个封装成单独的类。

19.Mediator 中介者
        用一个中介对象来封装一系列关于对象交互行为。
        为何使用Mediator?
        各个对象之间的交互操作非常多;每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉及到修改很多其他对象的行为,如果使用Mediator模式,可以使各个对象间的耦合松散,只需关心和 Mediator的关系,使多对多的关系变成了一对多的关系,可以降低系统的复杂性,提高可修改扩展性。

        如何使用?
                //首先 有一个接口,用来定义成员对象之间的交互联系方式:

                public interface Mediator { }

                //Meiator具体实现,真正实现交互操作的内容:

                public class ConcreteMediator implements Mediator {
                   //假设当前有两个成员.
                   private C1 c1 = new C1();
                   private C2 c2 = new C2();
                   ...
                }
                
                public abstract class Colleague {
                   private Mediator mediator;
                   public Mediator getMediator() {
                      return mediator;
                   }
                   public void setMediator( Mediator mediator ) {
                      this.mediator = mediator;
                   }
                }

                public class C1 extends Colleague{...}

                public class C2 extends Colleague{...}

                //每个成员都必须知道Mediator,并且和 Mediator联系,而不是和其他成员联系
                //注意,c1与c2的Mediator必须是同一个。

20.Interpreter 解释器
        定义语言的文法 ,并且建立一个解释器来解释该语言中的句子。
        Interpreter似乎使用面不是很广,它描述了一个语言解释器是如何构成的。

21.Visitor 访问者模式
        作用于某个对象群中各个对象的操作。它可以使你在不改变这些对象本身的情况下,定义作用于这些对象的新操作。

22.Iterator 迭代模式
        为外部提供统一访问方法而不暴露内部数据结构。

参考:
    http://www.uml.org.cn/sjms/sjms.asp
    http://www.jdon.com/designpatterns

阅读全文
0 0

相关文章推荐

img
取 消
img