博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
中介者模式
阅读量:2433 次
发布时间:2019-05-10

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

  中介者模式:用一个中介对象来封装一系列的对象交互,从而降低这些对象间的耦合性并且可以独立

                   地改变对象间的交互关系。中介者使各对象不需要显示地相互引用,从而使其藕合松散,
                   而且可以独立地改变它们之间的交互。

  1.中介者模式很容易在系统中应用,也很容易在系统中误用,当系统中出现了"多对多"交互复杂
    的对象群时,不要急于使用中介者模式,而要先反思系统在设计上是不是合理。
  2.中介者(Mediator)的出现减少了各个同事(Colleague)的藕合,使得可以独立地改变和复用
    各个Mediator和Colleague。
  3.由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象
    就从对象各自本身的行为转移到它们之间的交互上来,也就是站在一个更宏观的角度去看待系统。
  4.由于具体的中介者对象(ConcreteMediator)控制了集中化,于是就把交互复杂性变为了中介者的复杂性,
    就是使得中介者会变得比任何一个同事对象(ConcreteColleague)都复杂。

 

 

/** * 抽象同事类 */public abstract class Colleague {		protected Mediator mediator;		// 构造方法,得到中介者对象	public Colleague(Mediator mediator){		this.mediator = mediator;	}}

 

/** * 具体的同事对象1,每一个同事角色都知道对应的具体中介者角色, * 而且与其他的同事角色通信的时候,一定要通过中介者角色协作 */public class ConcreteColleague1 extends Colleague{	public ConcreteColleague1(Mediator mediator) {		super(mediator);	}		public void send(String message){		// 发送消息时通常是由中介者发送出去的		mediator.send(message, this);	}		public void notifyMessage(String message){		System.out.println("同事1得到消息:"+message);	}}

 

/** * 具体的同事对象2,每一个同事角色都知道对应的具体中介者角色, * 而且与其他的同事角色通信的时候,一定要通过中介者角色协作 */public class ConcreteColleague2 extends Colleague{	public ConcreteColleague2(Mediator mediator) {		super(mediator);	}		public void send(String message){		// 发送消息时通常是由中介者发送出去的		mediator.send(message, this);	}		public void notifyMessage(String message){		System.out.println("同事2得到消息:"+message);	}}

 

/** * 抽象中介者类,抽象中介者角色定义统一的接口用于各同事角色之间的通信 */public abstract class Mediator {	// 定义一个抽象的发送消息方法,得到同事对象和发送消息	public abstract void send(String message,Colleague colleague);}

 

/** * 具体的中介者类,通过协调各同事角色实现协作行为,需要了解所有的具体同事对象 */public class ConcreteMediator extends Mediator{	// 具体同事对象1	private ConcreteColleague1 colleague1;	// 具体同事对象2	private ConcreteColleague2 colleague2;		// 重写发送消息的方法,根据对象做出选择判断,通知对象	@Override	public void send(String message, Colleague colleague) {				if(colleague == colleague1){			colleague2.notifyMessage(message);		}else{			colleague1.notifyMessage(message);		}			}	public ConcreteColleague1 getColleague1() {		return colleague1;	}	public void setColleague1(ConcreteColleague1 colleague1) {		this.colleague1 = colleague1;	}	public ConcreteColleague2 getColleague2() {		return colleague2;	}	public void setColleague2(ConcreteColleague2 colleague2) {		this.colleague2 = colleague2;	}}

 

public class Main {	public static void main(String[] args) {				// 具体中介者对象		ConcreteMediator m = new ConcreteMediator();				// 让两个具体同事类认识中介者对象		ConcreteColleague1 c1 = new ConcreteColleague1(m);		ConcreteColleague2 c2 = new ConcreteColleague2(m);				// 让中介者认识各个具体同事类对象		m.setColleague1(c1);		m.setColleague2(c2);				// 具体同事类对象的发送消息都是通过中介者转发		c1.send("吃过饭了吗?");		c2.send("没有呢,你打算请客?");	}}

 

 

输出结果如下:

 

同事2得到消息:吃过饭了吗?同事1得到消息:没有呢,你打算请客?

 

转载地址:http://vyxmb.baihongyu.com/

你可能感兴趣的文章
如何设计一个安全可靠的 API 接口?
查看>>
大厂技术文档:Redis+Nginx+Spring全家桶+Dubbo精选
查看>>
笑死,别再黑程序员了好吗? | 每日趣闻
查看>>
Python 爬取 13966 条运维招聘信息,这些岗位最吃香
查看>>
以太坊创始人V 神:普通人看见现在,天才看见未来
查看>>
一周内咸鱼疯转 2.4W 次,最终被所有大厂封杀!
查看>>
关于鸿蒙 2.0,那些开发者不知道的一切
查看>>
Google 排名第一的语言,引数十万人关注:搞定它,技术大牛都甘拜下风
查看>>
软件开发行业,年轻与大龄程序员的生存现状
查看>>
打开数“智”化之门,一字之差带来的思考
查看>>
漫画 | TCP,一个悲伤的故事
查看>>
张一鸣无圈胜破圈?
查看>>
干货! AI 推断解决方案栈 Vitis AI 全流程独家解析
查看>>
真相了 | 敲代码时,程序员戴耳机究竟在听什么?
查看>>
回首互联网十年,我们能从八次烧钱大战中学到什么
查看>>
麒麟信安面向场景化创新,赋能openEuler商业验证
查看>>
3 年培养 10 万“码农”,郑州推出“码农计划”
查看>>
程序员弃码投中医?还做成了不错的生意! | 极客视频
查看>>
百度一 29 岁程序员因“篡改数据”被抓
查看>>
去年我年薪 30W,今年我一天做 3 顿饭
查看>>