package mediatorModel;
/*
 * 中介者模式:用一个中介对象来封装一系列的对象交互。
 * 中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
 * 
 * 中介者模式(Mediator)的适用性:
 * 1.一组对象以定义良好但是复杂的方式进行通信,产生的相互依赖关系结构混乱且难以理解。
 * 2.一个对象引用其他很多对象并且直接与这些对象通信,导致难以复用该对象。
 * 3.想定制一个分布在多个类中的行为,但又不想生成太多的子类
 * 
 * 中介者模式(Mediator)的参与者:
 * 1.Mediator
 * 中介者定义一个接口用于与各同事(Colleague)对象通信。
 * 2.ConcreteMediator
 * 具体中介者通过协调各同事对象实现协作行为,了解并维护它的各个同事。
 * 3.Colleague:
 * 抽象同事类。
 * 4.Colleagueclass
 * 具体同事类。每个具体同事类都只需要知道自己的行为即可,但是他们都需要认识中介者
 * 
 * 缺点:
 * 中介者控制集中化了,于是把交互复杂性变为了中介者的复杂性,这就使得中介者会比任何的同事(也就是这里的ColleagueclassY ColleagueclassM)
 * 都要复杂
 * 
 * 这里用一个不同国家的通信来举个例子
 */
public class MediatorModel {
	public static void main(String[] args) {
		//中介者
		ConcreteMediator concreteMediator = new ConcreteMediator();
		//美国
		ColleagueclassM colleagueclassM = new ColleagueclassM(concreteMediator);
		//伊拉克
		ColleagueclassY colleagueclassY = new ColleagueclassY(concreteMediator);
		
		//设置中介者需要管理的两个同事(需要通信的国家)
		concreteMediator.setColleagueclassM(colleagueclassM);
		concreteMediator.setColleagueclassY(colleagueclassY);
		
		colleagueclassM.tongxin("我要打你啊!!");
		colleagueclassY.tongxin("来呀不怕!!");
		
		//本来是美国说的”我要打你啊“ 但是经过中介者这么一传输 就是伊拉克得到的我要打你啊的消息
		
		
	}
}

/*
 * 中介者定义一个接口用于与各同事(Colleague)对象通信。
 */
abstract class Mediator{
	public abstract void tongxin(String mes,Colleague colleague);
}

/*
 * 抽象同事类。
 */
abstract class Colleague{
	//设置对象的中介者  也就是他想跟被人通信的时候让谁传达
	protected Mediator mediator;
	public  Colleague(Mediator mediator) {
		this.mediator = mediator;
	}
}

/*
 * 具体同事类
 */
class ColleagueclassY extends Colleague{
	public ColleagueclassY(Mediator mediator) {
		super(mediator);
	}
	
	//跟别的国家说话啊
	public void  tongxin(String msg){
		mediator.tongxin(msg, this);
	}
	public void Notify(String msg){
		System.out.println("伊拉克得到消息:"+msg);
	}
	
}
class ColleagueclassM extends Colleague{
	public ColleagueclassM(Mediator mediator) {
		super(mediator);
	}
	
	//跟别的国家说话啊
	public void  tongxin(String msg){
		mediator.tongxin(msg, this);
	}
	//这个是等着中介者 通过判断之后才调用这个方法的
	public void Notify(String msg){
		System.out.println("美国得到消息:"+msg);
	}
}

/*
 * 具体中介者
 */
class ConcreteMediator extends Mediator{
	public ColleagueclassM colleagueclassM;
	public ColleagueclassY colleagueclassY;
	public void setColleagueclassM(ColleagueclassM colleagueclassM) {
		this.colleagueclassM = colleagueclassM;
	}
	public void setColleagueclassY(ColleagueclassY colleagueclassY) {
		this.colleagueclassY = colleagueclassY;
	}
	//通信
	public void tongxin(String mes, Colleague colleague) {
		//如果是美国发送消息 那么就通知伊拉克
		if(colleague == colleagueclassM){
			colleagueclassY.Notify(mes);
		}else{
			//如果是伊拉克发送消息 那么就通知美国
			colleagueclassM.Notify(mes);
		}
	}
}