设计模式(十四)——中介者模式

一、中介者模式
中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式的相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互。

abstract class Mediator{   //抽象中介者类
	public abstract void Send(String message,Colleague colleague);
}
abstract class Colleague{        //抽象同事类
	protected Mediator mediator;
	public Colleague(Mediator mediator) {
		this.mediator=mediator;
	}
}
class ConcreteMediator extends Mediator{   //具体中介者类
	private ConcreteColleague1 colleague1;
	private ConcreteColleague2 colleague2;
	

	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;
	}


	@Override
	public void Send(String message, Colleague colleague) {
		// TODO Auto-generated method stub
		if(colleague==colleague1) {
			colleague2.Notify(message);
		}
		else {
			colleague1.Notify(message);
		}
	}
	
}
class ConcreteColleague1 extends Colleague{

	public ConcreteColleague1(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Send(String message) {
		mediator.Send(message, this);
	}
	public void Notify(String message) {
		System.out.println("同事1得到的信息:"+message);
	}
}
class ConcreteColleague2 extends Colleague{

	public ConcreteColleague2(Mediator mediator) {
		super(mediator);
		// TODO Auto-generated constructor stub
	}
	public void Send(String message) {
		mediator.Send(message, this);
	}
	public void Notify(String message) {
		System.out.println("同事2得到的信息:"+message);
	}
}
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("没有呢,你打算请客?");
	}
}

二、例:安理会做中介

abstract class UnitedNations { // 联合国机构类,相当于Mediator类
	public abstract void Declare(String message, Country colleague);
}

abstract class Country { // 国家类,相当于Colleague类
	protected UnitedNations mediator;

	public Country(UnitedNations meditor) {
		this.mediator = mediator;
	}
}

class USA extends Country { // 美国类,相当于ConcreteColleague1类

	public USA(UnitedNations meditor) {
		super(meditor);
		// TODO Auto-generated constructor stub
	}

	public void Declare(String message) {
		mediator.Declare(message, this);
	}

	// 获得消息
	public void GetMessage(String message) {
		System.out.println("美国获得对方信息:" + message);
	}
}

class Iraq extends Country { // 伊拉克类,相当于ConcreteColleague2类

	public Iraq(UnitedNations meditor) {
		super(meditor);
		// TODO Auto-generated constructor stub
	}

	public void Declare(String message) {
		mediator.Declare(message, this);
	}

	// 获得消息
	public void GetMessage(String message) {
		System.out.println("美国获得对方信息:" + message);
	}
}

class UnitedNationsSecurityCounci1 extends UnitedNations { // 联合国安全安理会,相当于ConcreteMediator类
	private USA colleague1;
	private Iraq colleague2;

	public USA getColleague1() {
		return colleague1;
	}

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

	public Iraq getColleague2() {
		return colleague2;
	}

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

	@Override
	public void Declare(String message, Country colleague) {
		// TODO Auto-generated method stub
		if (colleague == colleague1) {
			colleague2.GetMessage(message);
		} else {
			colleague1.GetMessage(message);
		}
	}

}

public class Main {
	public static void main(String[] args) {
		UnitedNationsSecurityCounci1 UNSC = new UnitedNationsSecurityCounci1();
		USA c1 = new USA(UNSC);
		Iraq c2 = new Iraq(UNSC);
		c1.Declare("不准研制核武器,否则要发动战争!");
		c2.Declare("我们没有核武器,也不怕侵略。");
	}
}

三、中介者模式优缺点
优点:减少了各个Colleague的耦合,使得可以独立的改变和复用各个Colleague类和Mediator。
缺点:由于ConcreteMediator控制了集中化,于是把交互复杂性变为了中介者的复杂性,使得中介者变得比任何一个ConcreteColleague都复杂。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值