Java设计模式——中介者模式

中介者模式

中介者模式也是用来降低类类之间的耦合的,因为如果类类之间有依赖关系的话,不利于功能的拓展和维护,因为只要修改一个对象,其它关联的对象都得进行修改。如果使用中介者模式,只需关心和Mediator类的关系,具体类类之间的关系及调度交给Mediator就行,这有点像spring容器的作用。先看看图:
在这里插入图片描述
介绍
意图:用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

主要解决:对象与对象之间存在大量的关联关系,这样势必会导致系统的结构变得很复杂,同时若一个对象发生改变,我们也需要跟踪与之相关联的对象,同时做出相应的处理。

何时使用:多个类相互耦合,形成了网状结构。

如何解决:将上述网状结构分离为星型结构。

关键代码:对象 Colleague 之间的通信封装到一个类中单独处理。

应用实例: 1、中国加入 WTO 之前是各个国家相互贸易,结构复杂,现在是各个国家通过 WTO 来互相贸易。 2、机场调度系统。 3、MVC 框架,其中C(控制器)就是 M(模型)和 V(视图)的中介者。

优点: 1、降低了类的复杂度,将一对多转化成了一对一。 2、各个类之间的解耦。 3、符合迪米特原则。

缺点:中介者会庞大,变得复杂难以维护。

使用场景: 1、系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象。 2、想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

注意事项:不应当在职责混乱的时候使用。

不采用中介者:
在这里插入图片描述
采用中介者:
在这里插入图片描述

Demo

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

# ConcreteColleagueA:
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);
	}
}
# ConcreteColleagueB:
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);
	}
}
# ConcreteColleagueC:
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);
	}
}
# Mediator
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);
}

# ConcreteMediator
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);
	}
 
}
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);//关闭音乐
	}
}

中介者模式与观察者模式区别

中介者(mediator)强调的是同事(colleague)类之间的交互

而观察者(observer)中的目标类(subject)强调是目标改变后对观察者进行统一的通讯

观察者模式的主动方在Observer上;而中介者模式的主动方在Colleague上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值