- 组合模式
需求:将层次结构尽可能简单地表示 抽象构件(Component):定义参加组合的对象的共有方法和属性,可以定义一些默认的行为或属性,比如getInfo 叶子构件(Leaf):叶子对象,其下没有分支。 树枝构件(Composit):树枝对象,它的作用是组合树枝节点和叶子节点。 相当于写一个接口component,代表一课树种的任意节点,实现分两种,一种叶子节点,一种分支节点。 代码:http://chenjumin.iteye.com/blog/580582
- 策略模式
需求:解决同一类问题的算法封装起来,可以更换解决问题的算法 Context: 环境类 Strategy: 抽象策略类 ConcreteStrategy: 具体策略类 相当于Context是基于某一问题的场景,包括一个实现函数algorithm,但它的算法不确定,它有一个函数指针(strategy类型)指定采用哪一种策略中的算法,strategy类是父类,它的子类为具体实现方法 代码:http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/strategy.html ppt中代码也可
- 桥模式
需求:抽象部与实现部分离实现二者的独立变化 Abstraction:抽象类 RefinedAbstraction:扩充抽象类 Implementor:实现类接口 ConcreteImplementor:具体实现类 长的和策略模式差不多,不同在于策略模式的context不可变,而桥模式的abstraction可以更改(operation函数功能可变,只要实现这个operation接口即可)因此可以实现不同operation()和不同operationImp()的组合(operation内部通常调用了operationImp)
而策略模式没有包含关系:
ppt中排序的实现:
上两句为桥模式,下两句为策略模式 代码:http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/bridge.html Ppt中的图更好讲述了它与策略模式的区别于联系:
- 适配器模式
需求:解决接口不兼容问题,把无法直接调用的系统库进行包装实现接口与当前统一 Target:目标抽象类 Adapter:适配器类 Adaptee:适配者类 Client:客户类
Adapter的实现:对象适配器使用关联方法实现,二类适配器使用多继承方法实现 代码:http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/adapter.html
- 迭代器模式
需求:不了解表的结构的情况下实现表的遍历访问(相当于Iterator的实现) 迭代器角色(Iterator):迭代器角色负责定义访问和遍历元素的接口。 具体迭代器角色(Concrete Iterator):具体迭代器角色要实现迭代器接口,并要记录遍历中的当前位置。 容器角色(Container):容器角色负责提供创建具体迭代器角色的接口。 具体容器角色(Concrete Container):具体容器角色实现创建具体迭代器角色的接口——这个具体迭代器角色于该容器的结构相关。 左边为表,右边为迭代器
- 抽象工厂模式
需求:提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类。 AbstractFactory:抽象工厂 ConcreteFactory:具体工厂 AbstractProduct:抽象产品 Product:具体产品 代码:http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/abstract_factory.html
- 观察者模式
需求:定义一个对象和多个对象直接的1vsn的依赖关系,使其依赖者依其状态的变化做出更新 Subject: 目标 ConcreteSubject: 具体目标 Observer: 观察者 ConcreteObserver: 具体观察者 在被观察者中有一个状态量,setstate()对外提供修改subject的接口,而getstate()对观察者提供获得subject状态的接口,在subject调用notify函数时,subject遍历列表中每一个观察者,使他们调用update函数(update函数参数为subject自身指针,即告诉观察者哪一个subject被更新了),update函数调用getstate()函数获取当前最新状态 代码:(类里面的代码很重要) http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/observer.html
- 代理模式
需求:在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现 间接引用。还可提供额外服务 Subject: 抽象主题角色 Proxy: 代理主题角色 RealSubject: 真实主题角色 与适配器模式的区别在于适配器中两类只有适配器继承于目标Target,而此模式真实物体和代理均继承于Subject父类,相同点在于代理和适配器中均有被代物的指针 代码:http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/proxy.html
- 简单工厂模式
需求:不需要知道调用类的名字,只需要知道其对应的参数,可以根据参数的不同返回不同类的实例 Factory:工厂角色 工厂角色负责实现创建所有实例的内部逻辑 Product:抽象产品角色 抽象产品角色是所创建的所有对象的父类,负责描述所有实例所共有的公共接口 ConcreteProduct:具体产品角色 具体产品角色是创建目标,所有创建的对象都充当这个角色的某个具体类的实例。 代码: http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/simple_factory.html
- 工厂方法模式
需求:每一个工厂提供一个产品的创建方法 Product:抽象产品 ConcreteProduct:具体产品 Factory:抽象工厂 ConcreteFactory:具体工厂 代码: http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/factory_method.html
- 单例模式
需求:希望对象只创建一个实例,并且提供一个全局的访问点。 Singleton:单例 代码:http://design-patterns.readthedocs.io/zh_CN/latest/creational_patterns/singleton.html 难点在于如何保证只存在一个实例: 解决方案: 简单判断:
保证线程同步:
但大部分情况直接返回,使用synchronized开销太大,于是使用双重判断:
利用一个类在一个ClassLoader中只会被初始化一次,这点是JVM本身保证的, 那就把初始化实例的事情扔给JVM好了:
避免恶汉式:
十二、访问者模式 需求:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作。 抽象访问者:抽象类或者接口,声明访问者可以访问哪些元素,具体到程序中就是visit方法中的参数定义哪些对象是可以被访问的。 访问者:实现抽象访问者所声明的方法,它影响到访问者访问到一个类后该干什么,要做什么事情。 抽象元素类:接口或者抽象类,声明接受哪一类访问者访问,程序上是通过accept方法中的参数来定义的。抽象元素一般有两类方法,一部分是本身的业务逻辑,另外就是允许接收哪类访问者来访问。 元素类:实现抽象元素类所声明的accept方法,通常都是visitor.visit(this),基本上已经形成一种定式了。 结构对象:一个元素的容器,一般包含一个容纳多个不同类、不同接口的容器,如List、Set、Map等,在项目中一般很少抽象出这个角色
代码: http://blog.csdn.net/zhengzhb/article/details/7489639 该模式中accept函数会调用visit方法(定义于visitor中,传入的参数是Element的指针),visit方法会调用Element中的dosomething函数。这里的操作不通过直接调用dosomething函数实现而用 一个visit函数将其封装,是为了扩展dosomehing的行为,即在visit函数中出了调用dosomething以外,还可以做其他的操作 十三、中介者模式 需求:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 Mediator: 抽象中介者 ConcreteMediator: 具体中介者 Colleague: 抽象同事类 ConcreteColleague: 具体同事类
代码: http://design-patterns.readthedocs.io/zh_CN/latest/behavioral_patterns/mediator.html 这个模式主要是在每一个同事里有一个中间人的指针,客户端(main函数)先创建一个中间人,然后调用register函数注册中间人所处理的同事(编号,指针)到一个map,register函数然后调用setMediator函数设置注册同事的中间人指针指向自己。之后,每次同事之间的通信通过sendmessage和receivemessage实现。Sendmessage调用调停人的操作函数,操作函数将调用接受者的receivemessage函数,这样就实现了两者之间的通信 十四、装饰模式 需求: 动态地给一个对象增加一些额外的职责 Component: 抽象构件 ConcreteComponent: 具体构件 Decorator: 抽象装饰类 ConcreteDecorator: 具体装饰类
代码:http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/decorator.html 开闭原则:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭 设计模式6大原则:http://www.uml.org.cn/sjms/201211023.asp#6