设计模式笔记

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

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
其中一个: 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,Proxy是代理的意思,我们也许有代理服务器等概念,代理概念可以解释为:在出发点到目的地之间有一道中间层,意为代理. 设计模式中定义: 为其他对象提供一种代理以控制对这个对象的访问. 为什么要使用Proxy? 1.授权机制 不同级别的用户对同一对象拥有不同的访问权利,如Jive论坛系统中,就使用Proxy进行授权机制控制,访问论坛有两种人:注册用户和游客(未注册用户),Jive中就通过类似ForumProxy这样的代理来控制这两种用户对论坛的访问权限. 2.某个客户端不能直接操作到某个对象,但又必须和那个对象有所互动. 举例两个具体情况: (1)如果那个对象是一个是很大的图片,需要花费很长时间才能显示出来,那么当这个图片包含在文档中时,使用编辑器或浏览器打开这个文档,打开文档必须很迅速,不能等待大图片处理完成,这时需要做个图片Proxy来代替真正的图片. (2)如果那个对象在Internet的某个远端服务器上,直接操作这个对象因为网络速度原因可能比较慢,那我们可以先用Proxy来代替那个对象. 总之原则是,对于开销很大的对象,只有在使用它时才创建,这个原则可以为我们节省很多宝贵的Java内存. 所以,有些人认为Java耗费资源内存,我以为这和程序编制思路也有一定的关系. 如何使用Proxy? 以Jive论坛系统为例,访问论坛系统的用户有多种类型:注册普通用户 论坛管理者 系统管理者 游客,注册普通用户才能发言;论坛管理者可以管理他被授权的论坛;系统管理者可以管理所有事务等,这些权限划分和管理是使用Proxy完成的. Forum是Jive的核心接口,在Forum中陈列了有关论坛操作的主要行为,如论坛名称 论坛描述的获取和修改,帖子发表删除编辑等. 在ForumPermissions中定义了各种级别权限的用户: public class ForumPermissions implements Cacheable { /** * Permission to read object. */ public static final int READ = 0; /** * Permission to administer the entire sytem. */ public static final int SYSTEM_ADMIN = 1; /** * Permission to administer a particular forum. */ public static final int FORUM_ADMIN = 2; /** * Permission to administer a particular user. */ public static final int USER_ADMIN = 3; /** * Permission to administer a particular group. */ public static final int GROUP_ADMIN = 4; /** * Permission to moderate threads. */ public static final int MODERATE_THREADS = 5; /** * Permission to create a new thread. */ public static final int CREATE_THREAD = 6; /** * Permission to create a new message. */ public static final int CREATE_MESSAGE = 7; /** * Permission to moderate messages. */ public static final int MODERATE_MESSAGES = 8; ..... public boolean isSystemOrForumAdmin() {   return (values[FORUM_ADMIN] || values[SYSTEM_ADMIN]); } ..... } 因此,Forum中各种操作权限是和ForumPermissions定义的用户级别有关系的,作为接口Forum的实现:ForumProxy正是将这种对应关系联系起来.比如,修改Forum的名称,只有论坛管理者或系统管理者可以修改,代码如下: 。。。。。。。。。。。。。。。 (希望对你有帮助)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值