设计模式之模式联用

设计模式之模式联用

  • 阅读建议
  • 基础知识
    • 设计模式简介
    • 常用设计模式及其定义
  • 正文
    • 适配器模式和桥接模式
    • 适配器模式和模板方法模式
    • 适配器模式和策略模式
    • 适配器模式和观察者模式
    • 组合模式和观察者模式
    • 外观模式和单例模式

阅读建议

  1. 本篇博客面向人群:
    设计模式有一定了解,希望在模式联用方面进一步加以学习的同学
    PS:对单个设计模式了解透彻的同学建议直接从正文部分开始阅读。
  2. 本篇博客内容参考:
    刘伟老师( 点击进入刘伟老师的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)
表示一个作用于某对象结构中的各个元素的操作。访问者模式让你可以在不改变各元素的类的前提下定义作用于这些元素的新操作

正文

前面铺垫了非常多,现在进入正式的模式联用介绍环节。

适配器模式和桥接模式

适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
桥接模式
将抽象部分与它的实现部分解耦,使得两者都能够独立变化
判断使用该联用的条件是:
系统中存在两个或多个独立变化的维度,且这两个或多个的维度都需要独立的进行扩展;同时,在拓展时需要用到一些现有的类。
因为该模式联用较为简单,且附结构图如下,故不作例题讲解
设计模式之模式联用_第1张图片

适配器模式和模板方法模式

适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
模板方法模式
定义一个操作中算法的框架,而将一些步骤延迟到子类中。模板方法模式使得子类不改变一个算法的结构即可重定义该算法的某些特定步骤。
判断使用该联用的条件是:
一次性实现一个算法的不变部分,并将可变的行为留给子类来实现;同时在子类的实现过程中需要用到已有类的方法。

例题
在某数据挖掘工具的数据分类模块中,数据处理流程包括四个步骤,分别是:① 读取数据;② 转换数据格式;③ 调用数据分类算法;④ 显示数据分类结果。对于不同的分类算法而言,第①步、第②步和第④步是相同的,主要区别在于第③步。第③步将调用算法库中已有的分类算法实现,例如朴素贝叶斯分类(Naive Bayes)算法、决策树(Decision Tree)算法、K最近邻(K-Nearest Neighbor, KNN)算法等。

设计模式之模式联用_第2张图片

适配器模式和策略模式

适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
策略模式
定义一系列算法,将每一个算法封装起来,并让它们可以相互替换。策略模式让算法可以独立于使用它的客户变化。
判断使用该联用的条件是:
一个系统需要动态地在几种算法中选择一种;同时,需要选择的方法由已有类实现,可以直接调用。

例题
某移动支付系统(PaySystem)在实现账户资金转入和转出时需进行身份验证,该系统为用户提供了多种身份验证方式,例如密码验证( Password Validator)、指纹验证(Fingerprint Validator)等,将来可能还会增加新的验证方式。该系统在实现指纹验证时需要调用手机自带的指纹识别模块中 FingerprintReader类的 process()方法来进行指纹识别和处理。
根据以上说明,选择两种合适的设计模式设计该身份验证模块,请给出设计模式的名称和定义,并结合实例绘制解决方案的结构图。(类名、方法名和属性名可自行定义。)

设计模式之模式联用_第3张图片

适配器模式和观察者模式

适配器模式
将一个类的接口转换成客户希望的另一个接口。适配器模式让那些接口不兼容的类可以一起工作
观察者模式
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新
判断使用该联用的条件是:
系统中一个对象的变化会导致一个或多个其他对象发生改变;同时,部分对象的方法有已有类来实现。

例题
某公司欲开发一套机房监控系统,如果机房达到某一指定温度,温度传感器(Thermosensor)将自动传递信号给各种响应设备,例如警示灯(CautionLight)将闪烁(flicker())、报警器(Annunciator)将发出警报(alarm())、安全逃生门(SecurityDoor)将自动开启(open())、隔热门(InsulatedDoor)将自动关闭(close())等,每一种响应设备的行为由专门的程序来控制。为了将来能够方便地引入新类型的响应设备,采用观察者模式和适配器模式设计并模拟实现该系统。

设计模式之模式联用_第4张图片

组合模式和观察者模式

组合模式
组合多个对象形成树形结构以表示具有部分-整体关系的层次结构。组合模式让客户端可以统一对待单个对象和组合对象
观察者模式
定义对象之间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象都得到通知并被自动更新
判断使用该联用的条件是:
系统中一个对象的变化会导致一个或多个其他对象发生改变;同时,系统中存在具有整体和部分的结构层次,希望能通过一种方式忽略整体和部分的差异,客户端可以一致地对待他们。

例题
会议管理系统的“会议通知发送”模块说明如下:
(1)行政管理人员可以给某个或某些员工Employee)发送会议通知,也可以给某个部门(Department)发送通知,如果给某个部门发送通知,将逐个给该部门每个员工发送会议通知。
(2)如果员工或者部门希望能够收到会议通知,必须先注册到一个会议列表(MeetingList)中,在发送通知时,系统将遍历会议列表,逐个将会议通知发送给注册用户 (User)
根据以上说明,选择两种合的设计模式设计该“会议通知发送”模块,请给出设计模式的名称和定义,并结合实例绘制解决方案的结构图。(类名、方法名和属性名可自行定义。)

设计模式之模式联用_第5张图片

外观模式和单例模式

外观模式
为子系统中的一组接口提供一个统一的入口。外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
单例模式
确保一个类只有一个实例,并提供一个全局访问点来访问这个唯一实例
判断使用该联用的条件是:
系统只需一个实例对象或者因为资源消耗太大而只允许创建一个对象;同时,系统需要简化调用或者降低客户端程序与子系统间的耦合

例题
某工业控制系统的“主控界面( MainFrame)”说明如下:
(1)该主控界面所占内存较多,需采用一种合适的解决方案控制主控界面实例数量,进而节约系统资源,提高系统性能。
(2)该主控界面需提供“一键启动”和“一键停止”功能,通过该功能可以一次性控制多台设备( Device)的启动和关闭。
根据以上说明,选择两种含适的设计模式设计该“主控界面”,请给出设计模式的名称和定义,并结合实例绘制解决方案的结构图(类名、方法名和属性名可自行定义。)

设计模式之模式联用_第6张图片

你可能感兴趣的:(课业,设计模式)