大话设计模式-第25章 世界需要和平--中介者模式- 高飞网

第25章 世界需要和平--中介者模式

2016-02-02 18:00:07.0

    尽管将一个系统分割成许多对象通常可以增加其复用性,但是对象间相互连接的激增又会降低其可复用性了。

大量的连接使得一个对象不可能在没有其他对象的支持下工作,系统表现为一个不可分割的整体,所以,对系统的行为进行任何较大的改动就十分困难了。


中介可以将网关结构变为星状结构  



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

//中介者
public abstract class Mediator{
        //定义发送消息接口,消息内容和抽象同事类
        public abstract void send(String message,Colleague colleague);
}
//具体的中介者
public class ConcreteMediator extends Mediator{
        private ConcreteColleague1 cc1;//同事1
        private ConcreteColleague2 cc2;//同事2

        public void setConcreteColleague1(ConcreteColleague1 cc1){
                this.cc1 = cc1;
        }
        public void setConcreteColleague2(ConcreteColleague2 cc2){
                this.cc2 = cc2;
        }
        public void send(String message,Colleague colleague){
                if(colleague == cc1){
                        cc2.doNotify(message);
                }else{
                        cc1.doNotify(message);
                }
        }
}
//抽象同事类
public abstract class Colleague{
        protected Mediator mediator;//持有中介者的引用
        public abstract void doNotify(String message);
        public Colleague(Mediator mediator){
                this.mediator = mediator;
        }
}
public class ConcreteColleague1 extends Colleague{
        public ConcreteColleague1(Mediator mediator){
                super(mediator);
        }
        public void doNotify(String message){
                System.out.println("同事1得到消息"+message);
        }      
        public void send(String message){
                mediator.send(message,this);
        }
}
public class ConcreteColleague2 extends Colleague{
        public ConcreteColleague2(Mediator mediator){
                super(mediator);
        }
        public void doNotify(String message){
                System.out.println("同事2得到消息"+message);
        }      
        public void send(String message){
                mediator.send(message,this);
        }
}
public class App{
        public static void main(String[] args){
                ConcreteMediator mediator = new ConcreteMediator();
                ConcreteColleague1 cc1 = new ConcreteColleague1(mediator);     
                ConcreteColleague2 cc2 = new ConcreteColleague2(mediator);

                mediator.setConcreteColleague1(cc1);
                mediator.setConcreteColleague2(cc2);

                cc1.send("2你好.");
                cc2.send("1你好...");
        }
}