文档章节

设计模式-中介者模式

 木本本
发布于 2019/12/07 23:42
字数 857
阅读 11
收藏 0

设计模式-中介者模式

定义

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使其耦合松散,而且可以独立地改变它们之间
的交互
UML

组成部分主要包含 Mediator抽象中介角色、ConcreteMediator 具体的中介角色、Colleague 同事(功能)角色

· Mediator 抽象中介角色:定义统一的接口,用于同事角色之间的通信

· ConcreteMediator 具体的中介角色:具体协调各个同事角色的协作行为,它必须依赖被协调的同事角色

· Colleague 同事角色:与其它同事角色通信必须依赖中介者角色,每个同事类角色行为分为两种:
    1,自发行为:改变本身的状态以及处理本身的逻辑,不与任何终结者角色或同事角色交互的行为
    2,依赖行为:必须依赖中介者角色才能完成的行为

优点

减少依赖,把原来一对多的依赖变成了一对一的依赖,降低了耦合,符合迪米特法则,分布式系统中的应用抽象也可以这么做

缺点

  业务复杂之后中介者会膨胀的非常快,如果是在单系统中此时可以拆分为多个应用中介,分布式系统中可以抽出更细力度的中介模型

实现


public abstract class AbstractMediator {

	private Colleague1 colleague1;

	private Colleague2 colleague2;

	public AbstractMediator() {
	}

	public AbstractMediator(Colleague1 colleague1, Colleague2 colleague2) {
		this.colleague1 = colleague1;
		this.colleague2 = colleague2;
	}

	protected Colleague1 getColleague1() {
		return colleague1;
	}

	public void setColleague1(Colleague1 colleague1) {
		this.colleague1 = colleague1;
	}

	protected Colleague2 getColleague2() {
		return colleague2;
	}

	public void setColleague2(Colleague2 colleague2) {
		this.colleague2 = colleague2;
	}

	public abstract void doSomeThing1();

	public abstract void doSomeThing2();

}


public class ConcreteMediator extends AbstractMediator {

	public ConcreteMediator() {
		super();
	}

	public ConcreteMediator(Colleague1 colleague1, Colleague2 colleague2) {
		super(colleague1, colleague2);
	}

	@Override
	public void doSomeThing1() {
		this.getColleague1().doSomething1();
	}

	@Override
	public void doSomeThing2() {
		this.getColleague2().doSomeThing2();
	}
}

public class Colleague1 {

	private AbstractMediator abstractMediator;

	public Colleague1(AbstractMediator abstractMediator){
		this.abstractMediator = abstractMediator;
	}

	public void doSomething1(){
		System.out.println("同事1完成的事1");
	}

	public void doSomeThingNeedAssist(){
		System.out.println("同事1处理需要中介协助的事情");
		this.abstractMediator.doSomeThing2();
	}



}


public class Colleague2 {

	private AbstractMediator abstractMediator;

	public Colleague2(AbstractMediator abstractMediator) {
		this.abstractMediator = abstractMediator;
	}

	public void doSomeThing2(){
		System.out.println("同事2完成事2");
	}

	public void doSomeThingNeedAssist(){
		System.out.println("同事2处理需要中介协助的事情");
		this.abstractMediator.doSomeThing1();
	}
}


public class Client {

	public static void main(String[] args) {
		AbstractMediator abstractMediator = new ConcreteMediator();
		Colleague1 colleague1 = new Colleague1(abstractMediator);
		Colleague2 colleague2 = new Colleague2(abstractMediator);
		abstractMediator.setColleague1(colleague1);
		abstractMediator.setColleague2(colleague2);


		colleague1.doSomeThingNeedAssist();

//		colleague2.doSomeThingNeedAssist();
	}
}

扩展

使用场景

如果只是简单的一个对象依赖多个对象就考虑采用中介者模式的话,很有可能造成中介者模式的实现非常复杂,而且只是逻辑转移到
中介者身上的情况下,未必能把原有的负责逻辑理清楚。

中介者模式使用于多个对象紧密耦合的情况。那紧密耦合的标准是什么?
如果在类图中出现了蜘蛛网的结构。
在这种情况下一定要采用中介者模式,把原本的网状结构梳理成星状结构,使原本负责的逻辑关系变得清晰。

常见应用

  • 机场调度中心
  • MVC框架
  • 中介服务

© 著作权归作者所有

上一篇: log4j2使用整理
粉丝 0
博文 18
码字总数 16627
作品 0
东城
私信 提问
《JavaScript设计模式与开发实践》原则篇(2)—— 最少知识原则

最少知识原则(LKP)说的是一个软件实体应当尽可能少地与其他实体发生相互作用。这 里的软件实体是一个广义的概念,不仅包括对象,还包括系统、类、模块、函数、变量等。 单一职责原则指导我们...

嗨呀豆豆呢
2018/12/30
0
0
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
JavaScript常用设计模式

设计模式 设计模式是一种在长时间的经验与错误中总结出来可服用的解决方案。 设计模式主要分为3类: 创建型设计模式:专注于处理对象的创建 Constructor构造器模式,Factory工厂模式,Singl...

a独家记忆
2018/07/13
0
0
《JavaScript设计模式与开发实践》模式篇(11)—— 中介者模式

中介者模式的作用就是解除对象与对象之间的紧耦合关系。增加一个中介者对象后,所有的 相关对象都通过中介者对象来通信,而不是互相引用,所以当一个对象发生改变时,只需要通知 中介者对象即...

嗨呀豆豆呢
2018/12/23
0
0
JavaScript 中常见设计模式整理

开发中,我们或多或少地接触了设计模式,但是很多时候不知道自己使用了哪种设计模式或者说该使用何种设计模式。本文意在梳理常见设计模式的特点,从而对它们有比较清晰的认知。 JavaScript 中...

牧云云
2018/05/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

每天AC系列(六):有效的括号

1 题目 LeetCode第20题,这题比较简单,匹配括号. 2 栈 这是栈的典型应用,括号匹配,当然不需要直接使用栈,使用一个StringBuilder即可: if(s.isEmpty()) return true;char a = s.charAt(0);...

Blueeeeeee
今天
27
0
Spring AOP-06-切入点类型

切入点是匹配连接点的拦截规则。之前使用的是注解@Pointcut,该注解是AspectJ中的。除了这个注解之外,Spring也提供了其他一些切入点类型: • 静态方法切入点StaticMethodMatcherPointcut •...

moon888
昨天
90
0
Class Loaders in Java

1. Introduction to Class Loaders Class loaders are responsible for loading Java classes during runtime dynamically to the JVM (Java Virtual Machine). Also, they are part of the ......

Ciet
昨天
96
0
以Lazada为例,看电商系统架构演进

什么是Lazada? Lazada 2012年成立于新加坡,是东南亚第一电商,2016年阿里投资10亿美金,2017年完成对lazada的收购。 业务模式上Lazada更偏重自营,类似于亚马逊,自建仓储和为商家提供服务...

春哥大魔王的博客
昨天
62
0
【自用】 Flutter Timer 简单用法

dart: void _startTime() async { _timer = Timer(Duration(seconds: sec), () { fun(xxx,yyy,zzz); }); } @override void dispose() { _timer.cancel()......

Tensor丨思悟
昨天
65
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部