设计模式之模式联用
- 阅读建议
- 基础知识
-
- 设计模式简介
- 常用设计模式及其定义
- 正文
-
- 适配器模式和桥接模式
- 适配器模式和模板方法模式
- 适配器模式和策略模式
- 适配器模式和观察者模式
- 组合模式和观察者模式
- 外观模式和单例模式
阅读建议
- 本篇博客面向人群:
对设计模式有一定了解,希望在模式联用方面进一步加以学习的同学
PS:对单个设计模式了解透彻的同学建议直接从正文部分开始阅读。 - 本篇博客内容参考:
刘伟老师( 点击进入刘伟老师的CSDN主页)的课件PPT和实验 告
刘伟老师所著书籍《设计模式实验及习题解析》
基础知识
设计模式简介
在进行模式联用的讲解前,我们先对设计模式的概念进行一些阐释
设计模式是在特定环境下为解决某一通用软件设计问题提供的一套定制的解决方案,该方案描述了对象和类之间的相互作用
Design pattern are descriptions of communicating objects and classes that are customized to solve a general design problem in a particular context.
- 模式的概念最早是起源于建筑业而非软件业的,20世纪80年代末,软件工程届注意到了建筑界的模式概念,“四人组(Gang of Four,分别是Erich Gamma、Richard Helm、Ralph Johnson和John Vlissides)”于1994年归纳发表了23种在软件开发中使用频率较高的设计模式,旨在用模式来沟通面向对象方法在分析、设计和实现之间的鸿沟。
- 软件模式:在一定条件下的软件开发问题及其解法
- 在解决方案这个模块中,大体可以分为三类:一是关联解法,即不用设计模式的解决方案;二是使用一种设计模式的解法;三是其他相关模式,指两种或两种以上设计模式联用的解决方案。
常用设计模式及其定义
为了降低博客的阅读门槛,这里先对常用设计模式进行简单介绍(如果需要深入了解各设计模式建议访问刘伟老师的博客( 点击进入刘伟老师的CSDN主页))
常用设计模式列表如下,其中加粗的为在模式联用中常出现的设计模式
模式名称 | 模式定义 |
---|---|
简单工厂模式 (Simple Factory Pattern) |
定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类 |
工厂方法模式 (Factory Method Pattern) |
定义一个用于创建对象的接口,但是让子类决定将哪一个类实例化。工厂方法模式让一个类的实例化延迟到其子类 |
抽象工厂模式 (Abstract Factory Pattern) |
提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类 |
建造者模式 (Builder Pattern) |
将一个复杂对象的创建与它的表示分离,使得同样的构建过程可以创建不同的表示 |
原型模式 (Prototype Pattern) |
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象 |
单例模式 (Singleton Pattern) |
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例 |
适配器模式 (Adapter Pattern) |
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作 |
桥接模式 (Bridge Pattern) |
将抽象部分与它的实现部分解耦,使得两者都能够独立变化 |
组合模式 (Composite Pattern) |
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象 |
装饰模式 (Decorator Pattern) |
动态地给一个对象增加一些额外的职责。就扩展功能而言,装饰模式提供了一种比使用子类更灵活的替代方案 |
外观模式 (Facade Pattern) |
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 |
享元模式 (Flyweight Pattern) |
运用共享技术有效地支持大量细粒度对象的复用 |
代理模式 (Proxy Pattern) |
给某一个对象提供一个代理或占位符,并由代理对象来控制对原对象的访问 |
职责链模式 (Chain of Responsibility Pattern) |
避免将一个请求的发送者与接收者耦合在一起,让多个对象都有机会处理请求。将接收请求的对象连接成一条链,并且沿着这条链传递请求,直到有一个对象能够处理它为止 |
命令模式 (Command Pattern) |
将一个请求封装为一个对象,从而让你可以用不同的请求对客户进行参数化,对请求排队或者记录请求日志,以及支持可撤销的操作 |
解释器模式 (Interpreter Pattern) |
给定一个语言,定义它的文法的表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子 |
迭代器模式 (Iterator Pattern) |
提供一种方法顺序访问一个聚合对象中的各个元素,而又不用暴露该对象的内部表示 |
中介者模式 (Mediator Pattern) |
定义一个对象来封装一系列对象的交互。中介者模式使对象之间不需要显式地相互引用,从而使其耦合松散,而且让你可以独立地改变它们之间的交互 |
备忘录模式 (Memento Pattern) |
在不破坏封装的前提下,捕获一个对象的内部状态,并且在该对象之外保存这个状态,这样以后可以将对象恢复到原先保存的状态 |
观察者模式 (Observer Pattern) |
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新。 |
状态模式 (State Pattern) |
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类 |
策略模式 (Strategy Pattern) |
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。 |
模板方法模式 (Template Method Pattern) |
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。 |
访问者模式 (Visitor Pattern) |
表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作 |
正文
前面铺垫了非常多,现在进入正式的模式联用介绍环节。
适配器模式和桥接模式
适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
桥接模式
将抽象部分与它的实现部分解耦,使得两者都能够独立变化
判断使用该联用的条件是:
系统中存在两个或多个独立变化的维度,且这两个或多个的维度都需要独立的进行扩展;同时,在拓展时需要用到一些现有的类。
因为该模式联用较为简单,且附结构图如下,故不作例题讲解
适配器模式和策略模式
适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
策略模式
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。
判断使用该联用的条件是:
一个系统需要动态地在几种算法中选择一种;同时,需要选择的方法由已有类实现,可以直接调用。
例题
某移动支付系统(PaySystem)在实现账户资金转入和转出时需进行身份验证,该系统为用户提供了多种身份验证方式,例如密码验证( Password Validator)、指纹验证(Fingerprint Validator)等,将来可能还会增加新的验证方式。该系统在实现指纹验证时需要调用手机自带的指纹识别模块中 FingerprintReader类的 process()方法来进行指纹识别和处理。
根据以上说明,选择两种合适的设计模式设计该身份验证模块,请给出设计模式的名称和定义,并结合实例绘制解决方案的结构图。(类名、方法名和属性名可自行定义。)
组合模式和观察者模式
组合模式
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象
观察者模式
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新
判断使用该联用的条件是:
系统中一个对象的变化会导致一个或多个其他对象发生改变;同时,系统中存在具有整体和部分的结构层次,希望能通过一种方式忽略整体和部分的差异,客户端可以一致地对待他们。
例题
会议管理系统的“会议通知发送”模块说明如下:
(1)行政管理人员可以给某个或某些员工Employee)发送会议通知,也可以给某个部门(Department)发送通知,如果给某个部门发送通知,将逐个给该部门每个员工发送会议通知。
(2)如果员工或者部门希望能够收到会议通知,必须先注册到一个会议列表(MeetingList)中,在发送通知时,系统将遍历会议列表,逐个将会议通知发送给注册用户 (User)
根据以上说明,选择两种合的设计模式设计该“会议通知发送”模块,请给出设计模式的名称和定义,并结合实例绘制解决方案的结构图。(类名、方法名和属性名可自行定义。)
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!