博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
学习设计模式——中介者模式
阅读量:6257 次
发布时间:2019-06-22

本文共 1871 字,大约阅读时间需要 6 分钟。

hot3.png

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. 优缺点:

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

 

转载于:https://my.oschina.net/ProgramerLife/blog/2249130

你可能感兴趣的文章
eclipse maven项目错误
查看>>
Xcode export/upload error: Your session has expired. Please log in 解决方法
查看>>
Daily Scrum - 12/02
查看>>
创建和编辑 crontab 文件
查看>>
钉钉发消息
查看>>
centos7 防火墙端口增加白名单
查看>>
Lucky Sum
查看>>
城市承灾体脆弱性和易损性的影响因素
查看>>
2019.1.22 区块链论文翻译
查看>>
centos7上修改主机名
查看>>
样式技巧总结
查看>>
python 获取当前ip
查看>>
plsql developer中,清除登录历史
查看>>
mysql中,创建包含json数据类型的表?创建json表时候的注意事项?查询json字段中某个key的值?...
查看>>
Json、JavaBean、String等互转
查看>>
Python-列表
查看>>
多线程
查看>>
[CF949C]Data Center Maintenance
查看>>
增强for循环的使用详解及代码
查看>>
程序员优化程序流程
查看>>