只有一个仲裁者的 Mediator模式

Mediator模式

应用场景

  • 将对象间的交互和通信封装在一个类中,各个对象间的通信不必显式去声明和引用,大大降低了系统的复杂性能。

本质

  • 封装交互

优点

  • 将多对多的通信转化为一对多的通信,降低了系统的复杂性。
  • Mediator还获得系统解耦的特性,降低了系统的耦合性,Mediator和各个Colleague就可以相互独立地修改了。
  • 控制集中,集中的优点就是便于管理,符合单一职责原则

缺点

  • 中介者的复杂性

角色

  • Mediator (仲裁者、中介者)
    Mediator角色负责定义与Colleague角色进行通信和做出决定的接口(API)。

  • ConcreteMediator (具体的仲裁者、中介者)
    CocreleMediator角色负贵实现Mediator角色的接口(API),负责实际做出决定。

  • Colleague (同事)
    Colleague角色负责定义与Mediator角色进行通信的接口(API)。

  • ConcreteColleague(具体的同事)
    ConcreteColleague阳色负费实观colo.角色的接口(API)。

Mediator模式的类图

在这里插入图片描述

示例程序

示例程序的类图

在这里插入图片描述

示例代码
public abstract class Mediator {

	public abstract void send(String message,Colleague colleague);
}
public class ConcreteMediator extends Mediator {

	private ColleagueImpl1 colleagueImpl1;
    private ColleagueImpl2 colleagueImpl2;
    
	public ColleagueImpl1 getColleagueImpl1() {
		return colleagueImpl1;
	}

	public void setColleagueImpl1(ColleagueImpl1 colleagueImpl1) {
		this.colleagueImpl1 = colleagueImpl1;
	}

	public ColleagueImpl2 getColleagueImpl2() {
		return colleagueImpl2;
	}

	public void setColleagueImpl2(ColleagueImpl2 colleagueImpl2) {
		this.colleagueImpl2 = colleagueImpl2;
	}

	@Override
	public void send(String message, Colleague colleague) {
		if (colleague instanceof ColleagueImpl1) {
            colleagueImpl2.receiveMessage(message);
        } else if (colleague instanceof ColleagueImpl2) {
            colleagueImpl1.receiveMessage(message);
        }
	}
}
public abstract class Colleague {

	protected Mediator mediator;

	protected Colleague(Mediator mediator) {
		this.mediator = mediator;
	}
	public abstract void send(String message);
	public abstract void receiveMessage(String message);
}
public class ColleagueImpl1 extends Colleague {

	ColleagueImpl1(Mediator mediator) {
		super(mediator);
	}

	@Override
	public void send(String message) {
		mediator.send(message, this);
	}

	@Override
	public void receiveMessage(String message) {
		System.out.println("收到1条消息:"+message);
	}

}
public class Main {

	public static void main(String[] args) {
		ConcreteMediator concreteMediator = new ConcreteMediator();

        ColleagueImpl1 colleagueImpl1 = new ColleagueImpl1(concreteMediator);
        ColleagueImpl2 colleagueImpl2 = new ColleagueImpl2(concreteMediator);

        concreteMediator.setColleagueImpl1(colleagueImpl1);
        concreteMediator.setColleagueImpl2(colleagueImpl2);

        colleagueImpl1.send("吃过饭了吗?");
        colleagueImpl2.send("没有呢,你打算请客? ");
	}
}

拓展思路

  • ConcreteColleague(具体的同事)可以复用,ConcreteMediator (具体的仲裁者、中介者)很难复用。

相关设计模式

  • Facade模式
    在Mediator模式中,Mediator 角色与Colleague 角色进行交互。
    而在Facade模式中,Facade 角色单方面地使用其他角色来对外提供高层接口(API)。
    因此,可以说Mediator模式是双向的,而Facade模式是单向的。

  • Observer模式
    有时会使用Observer根式来实现Mediator角色Colleague角色之间的通信。

满足的原则

  • 单一职责原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莫余

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值