您现在的位置是:首页 >技术教程 >设计模式之二十四种模式大汇总网站首页技术教程
设计模式之二十四种模式大汇总
类关系
-
关联关系
一个类是另一个类的属性成员。- 双向关联
- 单项关联
- 自关联
- 多重性关联:1…1、0…*、。。。。
- 聚合关系:表示整体和部分的关系
- 组合关系:整体和部分有同一的生命周期
-
依赖关系
一个类的方法中使用另一个类作为参数 -
泛化关系
父类和子类之间的关系 -
接口与实现关系
接口与类之间存在实现关(realization)系
-
示例
tip:该部分参考其他博主:http://t.csdn.cn/5Yjg6
创建型模型
- 简单工厂
用一个Factory
类中的一个方法,通过传参不同,if else
来判断返回不同Product
的子类对象
- 工厂方法
通过配置文件返回Factory
的具体子类如:FactoryA
对象,然后利用多态执行重写方法,返回对应 的Product
- 抽象工厂模式
通过要生产产品品牌生产所对应的工厂HaierFactory
,在该工厂中都是生产该品牌的具体对象,然后再调用具体方法productTV()
。
- 建造者模式
通过一个Director
对象,该对象含有Buider
成员,并且在该对象方法construct()
函数体中使用多态通过Buider
类的具体子类 BuiderA
的多个方法 buidFood(),buidDrink()..
最终返回一个 Meal
对象。----》不同对象的构建,在于对Buider
指向的那个子类
- 原型模式
通过具体原型类`DeepClone`或`ShallowClone`来实现原型接口`ProtoClone`,实现克隆方法。`Client`对象中含有`ProtoClone`对象,和其中属性,在`Coyp()`方法中通过调用接口中的方法,返回一个对象,通过`ProtoClone`指向的对象不同实现多态的克隆方法。
- 单例模式
通过私有换构造方法。在Object
类中,含有一个静态的Object
对象。
饿汉模式:在初始化时就创建该对象,static Object instance = new Object();
通过getInstance()
接口访问。
懒汉模式:在第一次调用getInstance()
接口时,在函数体中会进行判断,如果instance
为null
则才创建
结构型模式
- 适配器模式
上图为类适配器,适配器Adapter
会继承需要使用的Adaptee
类,然后再实现Target
接口,并在request()
实现中使用specificRequest()
完成包装,这样用户client
对象就可以使用Target
对象完成Adaptee
对象的功能。
对象适配器:Adapter
会继承Target
,会定义一个对象属性Adaptee
,在request()
中使用适配者的方法。
- 桥接模式
在基类Abstraction
中含有Implementor
对象,通过set()
方式给对象赋值为具体的子类对象,在子类RefinedAbstraction
中operation()
就可以调用属性对象方法operationlmpl()
。因此对属性对象的设置来完成方法实现的多态。
- 组合模式
抽象类Component
的子类中,包含具体类leaf
和一个容器类Composite
。容器类通常含有ArrayList list
属性对象,可以通过多态向该容器中添加多种leaf
类。其中它们都含有共通的方法operation()
,不同的实现。
透明组合:Component
中声明了所有管理成员对象的方法,包括Leaf
不需要的add()
等
安全组合:在Composite
中声明了用于管理的方法,而Component
中没有
- 装饰模式
使用Decorator
类,其继承于Component
,并且包含Compoent
属性对象,该对象可以通过set()
方法传入不同的ConcreteComponent
对象,在 operation()
中调用属性对象的方法component.operation()
实现原功能 。在其子类如DecoratorA
中,会有新增的方法addedBehavior()
,并在重写operation()
中额外进行调用。
- 外观模式
对象Facacde
中含有SubSystemA B C
属性对象,通过特点接口如on()
,off()
,同时控制其子系统。
- 享元模式
通过享元工厂FlyweightFactory
对象将不会变化的具体享元对象ConcreteFlyweight
进行存在,在使用的时候根据关键字key使用getFlyweight()
返回就可以访问。对于外部状态,可以使用接口operation()
在使用时由外部自行设置。
- 代理模式
代理对象Proxy
中包含RealSubject
属性对象,在实现抽象接口request()
时,除了调用对象属性的方法,往往还有该代理对象需要额外执行的操作,如:输出时间或运行结果的log、或进行判断权限判断是否可以执行操作。
远程代理:客户通过代理对象的统一接口进行访问操作,而不需要关系代理对象会进行网络服务访问远端服务器等操作。
虚拟代理:当某个对象的资源消耗比较大的时间,可以使用代理对象,等正需要访问这个对象的某些方法时再进行加载和实例化。
行为型模式
- 职责链模式
通过处理者对象Handler
属性中设置上级处理者successor
。并且在客户执行时往往调用最底层的处理者对象,在该处理者对象的handlerRequest()
方法中会根据条件判断需不需要执行successor
的处理方法。
- 命令模式
调用者Invoker
中含有命令类Command
的对象属性,有调用命令执行execute()
的方法。具体命令ConcreteCommand
对象中含有接收者对象参数,在重写的方法execute()
中使用接收者的处理操作完成命令。
- 解释器模式
通过一定的逻辑来调用具体的表达式子类如TerminalExpression
对象,用多态调用interpret()
完成翻译操作并返回结构,如表达式运算就返回计算后的结果。
- 迭代器模式
提供一种方法来访问聚合对象,而不用暴露这个对象的内部表示,其别名为游标。
在具体聚合类中ConcreteAggregate
中使用内部类声明具体迭代器Concreteleterator
,并通过createIterator()
返回一个迭代器对象。
- 中介者模式
抽象同事类ConcreteColleague
中含有中介者对象属性,具体中介者类COncreteMediator
中有容器存储不同具体的Colleague
对象。当调用同事A方法sendMessage()
给同事B发消息时,函数中会使用中介者属性对象的方法send()
,该方法中会通过参数访问到对象B,然后调用B的返回receive()
方法使B接收到信息。
- 备忘录模式
通过负责人Caretaker
中有备忘录Memento
对象属性,其有方法负责对备忘录对象注入set()
和获取get()
。原发器Originator
中有一个方法createMenento()
会返回保存state
状态的备忘录对象,并且通过restoreMenento()
恢复状态。
- 观察者模式
在目标类Subject
中有关于观察者Observer
对象的属性集合ArrayList
,在notify()
方法中会遍历观察者对象,并调用其update()
方法。
- 状态模式
环境类中含有状态State
对象属性,当使用setState()
改变对象属性后,其具体操作方法如handle()
中所执行的state.handle()
操作会不同。
- 策略模式
环境类Context
对象中有策略对象Strategy
属性,通过传入具体策略对象A B
的不同,algorithm()
中调用的方法会实现不同的操作。
- 模板方法模式
将完成不同的功能方法Operator1()
放进子类中,会用一个模板方法templateMethod()
调用相同Operator3()
或不同的方法。通过多态实现。
- 访问者模式
访问者对象Vistor
中通过方法vist(A)
传参调用重载函数,并且不同具体访问者的操作不同。
元素对象中的accept()
接口方法会调用visitor.vist()
。
对象结构ObjectStructure
中有ArrayList
属性对象存储不同元素,通过accept(v)
方法传入不同的具体访问者,并且遍历元素执行element.accapt(v)
方法。其中通过传入的观察者子类对象不同以及观察者方法的重载实现多态。