分类: Java
2013-08-21 22:23:23
创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
工厂方法模式其实就是用统一的接口创建具有共同特性的对象,是用来产生对象的模式,但是如果需要添加新类型的对象,需要修改工厂类,降低了可扩展行,而抽象工厂正是为解决此问题而产生的,抽象工厂创建的是工厂,然后根据工厂再生产相应的对象,这样增强了扩展性。建造者模式,则是针对抽象工厂的,通过建造者类,可以把许多抽象工厂结合在一起,实现更复杂的功能。单例模式确保一个jvm里面只有一个对象存在,减少了系统开销,防止系统流程混乱。原型模式又叫做克隆模式,是用来克隆出与原对象一样的新对象。
结构型模式:适配器模式、装饰模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
适配器模式将某个类的接口转换成客户端期望的另一个接口表示,目的是消除由于接口不匹配所造成的类的兼容性问题。主要分为三类:类的适配器模式、对象的适配器模式、接口的适配器模式。类适配器,Adapter类继承Source类,实现Targetable接口。对象适配器,Adapter类实现Targetable接口,内部拥有source对象。接口适配器,借助于一个抽象类,该抽象类实现了该接口,实现了所有的方法,我们写一个类,继承该抽象类,重写我们需要的方法就行,而不必要实现接口的所有方法,android里面用的很普遍。
装饰者模式,当我们需要动态的为一个类添加新功能的时候使用。比如java的io流,可以通过装饰者,完成对文件和字符的buffer的操作。
代理模式,已有的方法在使用的时候需要对原有的方法进行改进,可以将功能划分的更加清晰,有助于后期维护!这点和装饰者有点相似。aop就是一种动态代理。
外观模式,用统一的类封装了内部的实现细节,降低系统的复杂性,只需要操作接口内,而不需要知道实现细节。
桥接模式,将抽象化与实现化解耦,使得二者可以独立变化,最典型的例子DriverManager,通过一个公共接口driver,不论是mysqlDriver,SqlDriver,oracleDriver,都不用修改DriverManager的代码,把结构和实现分离出来。
组合模式,将多个对象组合在一起进行操作,常用于表示树形结构中,例如二叉树,数等。
享元模式,实现对象的共享,即共享池,通常与工厂模型结合使用,最常用的如,数据库连接池。
行为型模式:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式
策略模式,策略模式是一种思想,贯穿在所有设计模式里面,其实就是面向接口编程的思想,可以外加一个辅助抽象类,把公共方法提取出来。
模板方法,公共方法定义一个抽象类,对外提供一个统一的方法,方法的实现调用内部的抽象方法,子类实现抽象方法,通过定义一个父类对象,调用子类的实现,其中用到访问者模式的思想。
观察者模式,首先观察者要申请加入被观测队列,当被观察对象状态发生改变时,被观察者通知所有观察者,实际就是调用观察者执行某个方法,用在一个对象状态变化,其它对象也要做相应修改,比如QQ上线,通知他的好友,实时修改状态。
迭代器模式,collection里面有iterator方法,不同的collection重写此方法,实现自己的逻辑。java的Iterator和Collection就是典型例子。
责任链模式,有多个对象,每个对象持有对下一个对象的引用,这样就会形成一条链,请求在这条链上传递,直到某一对象决定处理该请求。
命令者模式,Invoker是调用者,Receiver是被调用者,MyCommand是命令,命令持有接收对象,调用者持有命令对象,使得调用者与接收者解偶。
备忘模式,假设有原始类A,A中有各种属性,A可以决定需要备份的属性,备忘录类B是用来存储A的一些内部状态,类C呢,就是一个用来存储备忘录的,且只能存储,不能修改等操作。
状态者模式,当对象的状态改变时,同时改变其行为,很好理解!所有的switch都可以改写成状态者模式。
访问者模式,如果我们想为一个现有的类增加新功能,不得不考虑几个事情:1、新功能会不会与现有功能出现兼容性问题?2、以后会不会再需要添加?3、如果类不允许修改代码怎么办,访问者模式适用于数据结构相对稳定算法又易变化的系统。实际上就是subject(visitor);visitor(subject);实现了父类调用子类的方法。保证父类接口不变,重写子类方法,调用父类的方法,实际是调用了重写的子类方法。
中介者模式,中介者模式也是用来降低类类之间的耦合的,同等级对象之间相互调用,耦合性很高,对象关系变成网状,改用中介者模式后,关系变成星状,android里面activity直接通信的intent就是中介者模式。
解释器模式,般主要应用在OOP开发中的编译器的开发中,所以适用面比较窄。解释器模式用来做各种各样的解释器,如正则表达式等的解释器等等!
http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html