设计模式入门 您所在的位置:网站首页 中介者模式实例图 设计模式入门

设计模式入门

2024-07-10 13:47| 来源: 网络整理| 查看: 265

前言

中介者模式又称为调停者模式,作为行为型的模式之一,本身是个很低调的模式,因为应用场合有限,所以不那么被人熟知下文我将举例介绍中介者模式的作用,以及中介者模式应用的意义,文末我会总结一下中介者模式的一些特点

 

实例引入

       假设现在科技发达之后,家里所有设备都是智能化的,而小明在家洗澡的时候有个习惯就是喜欢听歌,而且洗澡时候还要把窗帘拉上。因此就有这种情形,小明要拉窗帘可能就是要洗澡,当然也要听歌,因此我们希望小明家的洗浴设备,音响设备和窗帘设备都能协同合作,不管操作哪种设备,其他两种设备都有一定响应,以此写出程序。

 

程序上手

       现在很明显我们可以看出来,我们有三个对象,也就是三种设备,程序看起来也很简单,只要打卡一个设备,这个设备再打开其他两个设备就好啦,只要在一个设备的类里放两个其他设备的 引用,很容易就搞定了,当然这样最简单啦,这样写出来的程序对象关系如下图(这个程序我就不敲了)。

 

程序分析(当然这个程序能想像的到)

      这个程序最主要的功能就是在 一个类里完成了对另外两个类的方法作用。但是这样设计有两个主要缺陷(其实是对象之间耦合度过高而引起的)

一旦窗帘设备坏掉,需要更换,那样我们就要让新的窗帘设备建立别的设备的连接,这样会很麻烦如果我们又有别的需求,比如洗澡的时候要把门锁住,那门锁的智能设备又要关联所有设备,更加麻烦

 

引入中介者

中介者模式的引入则极大的弥补了上述程序的两个缺陷,对象交互如下图

      其实中介者就好比智能家居的管家,这样所有对象的交互指令都通过它来传达,这样这个中介者负责与对象之间联系,对象与对象之间不再进行直接的交互,也就是对对象关系 进行解耦。下面我们就引入具体例子

 

中介者模式角色组成

抽象中介者(mediator)

定义一个接口用于和对象通信(SmartDevice)

具体中介者(concretemediator)

协调各同事对象实现协作,了解维护各个同事()

抽象同事角色(colleague)

规定了同事的基本类型

具体同事角色(concreteColleague)

每个同事都知道中介者对象,要与同事通信则把通信告诉中介者

 

中介者模式一般类图(我程序的类图)

 

java源程序

抽象同事类(智能设备)

package mediator_12; public abstract class SmartDevice { //相关设备打开之后 使其进入准备状态 public abstract void readyState(String instruction); //操作该设备 public abstract void operateDevice(String instruction, SmartMediator mediator); }

具体同事类1(窗帘设备)

package mediator_12; public class CurtainDevice extends SmartDevice{ public void operateDevice(String instruction,SmartMediator mediator) { System.out.println("窗帘已"+instruction);//通过传入指令,打开或关闭窗帘 mediator.curtain(instruction);//窗帘通过中介者唤醒音乐设备和洗浴设备 } public void readyState(String instruction) { //如果其他设备开启则调用此方法,唤醒窗帘 System.out.println("窗帘设备准备"+instruction); } }

具体同事类2(音响设备)

package mediator_12; public class MusicDevice extends SmartDevice{ public void operateDevice(String instruction,SmartMediator mediator) { System.out.println("音乐设备已"+instruction); mediator.music(instruction); } public void readyState(String instruction) { System.out.println("音乐设备准备"+instruction); } }

具体同事类3(洗浴设备)

package mediator_12; public class BathDevice extends SmartDevice{ public void operateDevice(String instruction, SmartMediator mediator) { System.out.println("洗浴设备"+instruction); mediator.bath(instruction); } public void readyState(String instruction) { System.out.println("洗浴设备正在准备"+instruction); } }

抽象中介者(中介设备)

package mediator_12; public abstract class SmartMediator { //保留所有设备的引用是为了当接收指令时可以唤醒其他设备的操作 SmartDevice bd; SmartDevice md; SmartDevice cd; public SmartMediator(SmartDevice bd, SmartDevice md, SmartDevice cd) { super(); this.bd = bd; this.md = md; this.cd = cd; } public abstract void music(String instruction); public abstract void curtain(String instruction); public abstract void bath(String instruction); }

具体中介者

package mediator_12; public class ConcreteMediator extends SmartMediator{ public ConcreteMediator(SmartDevice bd, SmartDevice cd, SmartDevice md) { super(bd, cd, md); } public void music(String instruction) {//音乐被唤醒后,使其他设备进入准备状态 cd.readyState(instruction);//调用窗帘的准备方法 bd.readyState(instruction);//调用洗浴设备的准备方法 } public void curtain(String instruction) { md.readyState(instruction); bd.readyState(instruction); } public void bath(String instruction) { cd.readyState(instruction); md.readyState(instruction); } }

客户端

package mediator_12; public class Client { public static void main(String[] args) { SmartDevice bd=new BathDevice(); SmartDevice cd=new CurtainDevice(); SmartDevice md=new MusicDevice(); SmartMediator sm=new ConcreteMediator(bd, cd, md);//把设备引用都保存在调停者中 cd.operateDevice("open",sm); //开启窗帘 md.operateDevice("close",sm);//关闭音乐 } }

运行结果

 

程序分析

首先我们要说这个程序解决了我上面说的两个缺陷,现在我们不管是要新增设备还是替换设备,既然我们的设备的关联者只有中介者了,那么修改一下中介者就好了。之前我们是在自己设备中就能联系其他设备,现在我们把这种联系统统交给中介者去做。不过可以看出现在的程序变的并不简单,由于我们引入中介者,反而看起来程序变的更加复杂了 。

 

既然认识了中介者,现在我们在了解一下中介者的特点

作用

中介者对象封装了一系列的对象交互,中介者使各对象不需要彼此联系来相互作用,从而使耦合松散,而且可以独立的改变他们之间的交互。

 

应用场景

当有多个对象彼此间相互交互的时候,自然就会想到对象间的耦合度过高,解决办法就是封装对象间的交互行为,因此就能想到中介者模式就是干这行的。

 

应用到的设计原则

高内聚,低耦合,使用中介者明显降低了对象之间的耦合

 

中介者模式优点

通过让对象彼此解耦,增加对象的复用性通过将控制逻辑集中,可以简化系统维护通过中介者使一对所变成了一堆一,便于理解

缺点

如果涉及不好,引入中介者会使程序变的复杂中介者承担过多责任,维护不好会出大事


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有