设计模式概述

http://design-patterns.readthedocs.io/zh_CN/latest/index.html
OO基础:抽象、封装、继承、多态。
OO原则:
    1.封装变化 
    2.多用组合、少用继承 
    3.针对接口编程,不针对实现编程
    4.为交互对象之间的松耦合设计而努力
    5.对扩展开放,对修改关闭(开闭原则)
    6.要依赖抽象,不要依赖具体类(依赖倒转原则)
    7.最少知识原则:只和你的密友谈话(不要将过多的类耦合在一起)。
 
策略模式:定义算法族,分别封装起来,使它们可以互相替换,此模式让算法的变化独立于使用算法的用户。
观察者模式:在对象之间建立一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象都会收到通知,并自动更新。(典型应用:MVC、JavaBean、RMI、Swing、很多GUI框架)
装饰模式:持有被装饰者的对象,动态地把责任附加到对象身上,以对功能进行扩展和增强。
// 抽象工厂模式:提供一个接口用来创建相关或依赖对象的家族,而不需要明确指定具体类。

简单工厂模式(Simple Factory):简单工厂模式又叫静态工厂模式,顾名思义,通过一个具体的工厂类,在该工厂类中定义返回值为不同实例对象的静态方法,来获得各种具体的实例对象。

工厂方法模式(Factory Method):建立一个抽象工厂,其不同的工厂实例用来创建不同的产品实例对象(单个产品),如果要增加新的产品,只需增加新的产品工厂即可。符合开闭原则。

抽象工厂模式(Abstract Factory):建立一个抽象工厂,用来实例化工厂子类,这些工厂子类用来生产对应的产品族(即一组对象实例)。

 
所有的工厂都是用来封装对象的创建。(封装对象创建)
 
单例模式:确保一个类只有一个实例,并提供一个全局访问点。(需要私有构造器、一个静态变量、一个静态方法)
命令模式:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销操作。命令模式将发出请求的对象和执行请求的对象解耦。在被解耦的两者之间是通过命令对象进行沟通的,命令对象封装了接收者和一个或一组动作。(遥控器的例子:遥控器上每一个按钮绑定了一个命令(执行命令的对象和要执行的命令)。)(封装方法调用
命令模式的更多用途:队列请求(利用一个队列存储命令对象)和日志请求(可以将一系列的请求对象进行持久化,以便在系统崩溃时恢复)。
适配器模式:将一个类的接口转换成客户所期望的另一个接口。适配器让原本不兼容的类可以合作无间。(定义一个新类实现要适配的接口,并持有被适配类的对象,测试类中调用新接口的方法实际上调用的是被适配对象的方法。)
装饰模式:新类中持有原有类的对象,并对该对象的方法进行功能增强。
外观模式:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。(外观和适配器可以包装许多类,但是外观的意图是简化接口,而适配器的意图是将接口转换成不同的接口。)(封装复杂接口
模版方法模式:在一个方法中定义一个算法的骨架,而将一些步骤方法的实现延迟到子类中(父类可以定义为抽象方法)。模版方法使得子类可以在不改变算法骨架的情况下,重新定义算法中的某些步骤方法。这个模式是用来创建一个算法的模版。(要用到抽象类:即模版方法(由一组方法组成的新方法)定义在抽象类中。)
策略模式和模板方法模式都是封装算法,但前者用的是组合,后者用的是继承。
模版中的方法有些是具体的方法,有些是抽象方法,如果子类必须提供某个方法的具体实现时,该方法要在模版中声明为抽象方法,如果某个方法在子类中是可选的,则使用钩子
钩子的用法:1.钩子可以让子类实现模版中可选的部分,该方法对于子类的实现来说并不重要,子类可以选择实现或者置之不理。(模版中有默认的实现,可以为空实现。)2.钩子的另一个用法是让子类能够有机会对模版方法中某些即将发生的(或刚刚发生的)步骤做出反应。比如名为justReOrderedList()的钩子方法允许子类在内部列表重新组织后执行某些动作(例如在屏幕上重新显示数据)。
迭代器模式:提供一个方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。 (迭代器允许访问聚合的元素,而不需要暴露它的内部结构 )
组合模式:允许你将对象组成树形结构来表现“整体/部分”的层次结构。组合能让客户以一致的方式处理个别对象和对象组合。 
状态模式:允许对象在状态改变时改变它的行为,对象看起来好像修改了它的类。   
代理模式:为另一个对象提供一个替身或占位符以控制对这个对象的访问。(使用代理模式创建代表(representIve)对象,让代表对象控制某对象的访问,被代理的对象可以是远程的对象、创建开销大的对象或需要安全控制的对象。)
代理模式包括:
远程代理(remote proxy):当给一个不同地址空间的对象提供一个本地的代理对象。
虚拟代理(virtual proxy):当需要用一个消耗资源较少的对象来代表一个消耗资源较多的对象,从而降低系统开销、缩短运行时间时可以使用虚拟代理,例如一个对象需要很长时间才能完成加载时。
保护代理(protect proxy):当需要控制对一个对象的访问,为不同用户提供不同级别的访问权限时可以使用保护代理。
缓冲代理(cache proxy):当需要为某一个被频繁访问的操作结果提供一个临时存储空间,以供多个客户端共享访问这些结果时可以使用缓冲代理。通过使用缓冲代理,系统无须在客户端每一次访问时都重新执行操作,只需直接从临时缓冲区获取操作结果即可。
智能引用代理(smart reference proxy):当需要为一个对象的访问(引用)提供一些额外的操作时可以使用智能引用代理。
 
 
 

posted on 2016-04-29 15:47  Yanspecial  阅读(116)  评论(0编辑  收藏  举报