欢迎来到Doc100.Net免费学习资源知识分享平台!
您的位置:首页 > 程序异常 >

中介者方式

更新时间: 2014-05-18 18:30:29 责任编辑: Author_N8

 

中介者模式

  中介者模式:用一个中介对象来封装一系列的对象交互,从而降低这些对象间的耦合性并且可以独立
                   地改变对象间的交互关系。中介者使各对象不需要显示地相互引用,从而使其藕合松散,
                   而且可以独立地改变它们之间的交互。


  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得到消息:没有呢,你打算请客?

 

上一篇:上一篇
下一篇:下一篇

 

随机推荐程序问答结果

 

 

如对文章有任何疑问请提交到问题反馈,或者您对内容不满意,请您反馈给我们DOC100.NET论坛发贴求解。
DOC100.NET资源网,机器学习分类整理更新日期::2014-05-18 18:30:29
如需转载,请注明文章出处和来源网址:http://www.doc100.net/bugs/t/921277/
本文WWW.DOC100.NET DOC100.NET版权所有。