文档章节

学习设计模式——中介者模式

江左煤郎
 江左煤郎
发布于 10/18 23:21
字数 930
阅读 7
收藏 0

1. 认识中介者模式

    1. 定义:用一个中介对象来封装一系列的对象交互行为,中介者使得各对象不需要显式的互相引用,从而使其松散耦合,独立的改变他们之间的交互。

    2. 结构:

  • Mediator:中介者接口,在里面定义各个同事之间交互需要的办法,可以是公共的通讯方法,也可以是小范围的交互方法。
  • MediatorImpl:中介者具体实现类,他需要了解并维护各个交互的对象,并负责各个对象之间的交互关系。
  • Colleague:同事类,同事类通常定义为抽象类,主要负责约束同事对象的类型,并实现一些公共方法,比如每个同事类都应该持有中介者对象。
  • ColleagueImpl:具体的同事类,实现自己的功能,在需要与其他同事类进行交互时,就通过持有的中介者对象来进行交互。

    3. 参考代码实现:

/**
 * @ClassName:Mediator
 * @Description:中介者接口
 */
public interface Mediator {
	//定义同事对象之间的交互接口,比如
	public void exchange(Colleague c);

}
/**
 * @ClassName:MediatorImpl
 * @Description:中介者具体实现类,必须维护一系列需要交互的同事类对象
 */
public class MediatorImpl implements Mediator {
	//维护同类对象
	private ColleagueImplA a;
	private ColleagueImplB b;

	public void setA(ColleagueImplA a) {
		this.a = a;
	}

	public void setB(ColleagueImplB b) {
		this.b = b;
	}

	@Override
	public void exchange(Colleague c) {
		// 在此处定义同事类对象之间的交互动作,传入参数c表示该对象发生了变化,需要与其他同事类对进行交互
		
	}

}

/**
 * @ClassName:Colleague
 * @Description:同事类的抽象父类
 */
public abstract class Colleague {
	//持有中介者对象
	Mediator m;
	public Colleague(Mediator m){
		this.m=m;
	}
	//获取当前同事类对象中的中介者对象
	public Mediator getMediator(){
		return m;
	}
}

public class ColleagueImplA extends Colleague{
	public ColleagueImplA(Mediator m) {
		super(m);
	}
	//示意方法,表示某些功能
	public void operation(){
		//如果需要与其他同事类对象进行交互,通知中介者对象
		getMediator().exchange(this);
		
	}
}
public class ColleagueImplB extends Colleague{
	public ColleagueImplB(Mediator m) {
		super(m);
	}
	//示意方法,表示某些功能
	public void operation(){
		//如果需要与其他同事类对象进行交互,通知中介者对象
		getMediator().exchange(this);
		
	}
}

2. 理解中介者模式

    1. 功能:封装对象之间的交互行为,由中介者对象来处理多个对象之间的交互关系。

    2. Mediator接口不一定需要,可以直接使用中介者实现类,这取决于中介者类是否需要多个实现类型,或者说是否需要扩展版本,

    3. 同事类:在中介者模式中,所有同事类都需要继承同一个父类来建立起一个同事的关系。

    4. 中介者类对象与同事类对象之间的通信:一种实现方法是定义一个特殊的通知接口,作为一个通用的方法,让各个同事类对象调用该方法,比如上面的参考代码;还有一种实现方法,可以使用观察者模式,让Mediator成为观察者,同事类为Subject,同事类对象发送变化就会通知观察者进行对应的交互行为。

    5. 优缺点:

  • 松散耦合
  • 集中控制交互
  • 多对多变为一对多
  • 缺点就是过度集中化

 

© 著作权归作者所有

共有 人打赏支持
江左煤郎
粉丝 16
博文 68
码字总数 174368
作品 0
西安
后端工程师
私信 提问
JavaScript常用设计模式

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

a独家记忆
07/13
0
0
【软考学习】设计模式——中介者模式

【背景】 设计模式是非常重要的一块知识,每个设计模式都值得深入了解和学习。 【内容】 结构型设计模式总结: 中介者设计模式总结: 一、定义:用于一个中介对象来封装一系列的对象交互。中...

yym15732626210
01/31
0
0
JavaScript 中常见设计模式整理

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

牧云云
05/18
0
0
【设计模式笔记】(十六)- 代理模式

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

MrTrying
06/24
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Spark性能优化之道

Spark性能优化之道——解决Spark数据倾斜(Data Skew)的N种姿势 本文结合实例详细阐明了Spark数据倾斜的几种场景以及对应的解决方案,包括避免数据源倾斜,调整并行度,使用自定义Partition...

GordonNemo
1分钟前
0
0
大数据驱动业务决策,CDN实时日志重磅上线

摘要: 阿里云CDN上线了实时日志功能,打通日志服务(SLS)的能力,将CDN采集的实时日志,在小于60秒的时间内投递至日志服务,进行实时、交互式分析和报表呈现。通过CDN日志的实时分析,可以快...

阿里云官方博客
7分钟前
0
0
springCloud学习笔记系列(3)-服务容错保护:Spring Cloud Feign

Feign包含了Ribbon和Hystrix,这个在实战中才慢慢体会到它的意义,所谓的包含并不是Feign的jar包包含有Ribbon和Hystrix的jar包这种物理上的包含,而是Feign的功能包含了其他两者的功能这种逻...

快乐的小火柴
8分钟前
0
0
各种数据库数据类型差异

文本 整数 浮点数 decimal Hive数据库 create table default.foo ( a DECIMAL, -- Defaults to decimal(10,0) b DECIMAL(20), -- Defaults to decimal(20,0) c DECIMAL(9, 7), d DE......

了凡川
13分钟前
1
0
springboot中filter的用法

一、在spring的应用中我们存在两种过滤的用法,一种是拦截器、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。 二、f...

xiaomin0322
31分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部