美文网首页
中介者模式

中介者模式

作者: yuzhiyi_宇 | 来源:发表于2019-03-12 18:54 被阅读0次

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

    中介者模式的结构图

    中介者模式中的角色:

    • Mediator:抽象中介者,定义了同事对象到中介者对象的接口。
    • ConcreteMediator:具体中介者对象,实现抽象类的方法,它需要知道所有具体同事类,并从具体同事接收消息,向具体同事对象发出命令。
    • Colleague:抽象同事类。
    • ConcreteColleague:具体同事类,每个具体同事只知道自己的行为,而不了解其他同事类的情况,但它们却都认识中介者模式。

    中介者模式的简单实现

    (1)抽象中介者

    public abstract class Mediator {
    
        public abstract void send(String message, Colleague colleague);
    }
    

    (2)具体中介者对象

    public class ConcreteMediator extends Mediator {
    
        private ConcreteColleague1 concreteColleague1;
        private ConcreteColleague2 concreteColleague2;
    
        public void setConcreteColleague1(ConcreteColleague1 concreteColleague1) {
            this.concreteColleague1 = concreteColleague1;
        }
    
        public void setConcreteColleague2(ConcreteColleague2 concreteColleague2) {
            this.concreteColleague2 = concreteColleague2;
        }
    
        @Override
        public void send(String message, Colleague colleague) {
            if (colleague == concreteColleague1) {
                concreteColleague2.notify(message);
            } else {
                concreteColleague1.notify(message);
            }
        }
    }
    

    (3)抽象同事类

    public class ConcreteColleague1 extends Colleague {
    
        public ConcreteColleague1(Mediator mediator) {
            super(mediator);
        }
    
        public void send(String message) {
            mediator.send(message, this);
        }
    
        public void notify(String message) {
            System.out.println("同事1接收到消息:" + message);
        }
    }
    
    public class ConcreteColleague2 extends Colleague {
    
        public ConcreteColleague2(Mediator mediator) {
            super(mediator);
        }
    
        public void send(String message) {
            mediator.send(message, this);
        }
    
        public void notify(String message) {
            System.out.println("同事2接收到消息:" + message);
        }
    }
    

    (4)客户端调用

    public class Client {
    
        public static void main(String[] args) {
            ConcreteMediator concreteMediator = new ConcreteMediator();
    
            ConcreteColleague1 concreteColleague1 = new ConcreteColleague1(concreteMediator);
            ConcreteColleague2 concreteColleague2 = new ConcreteColleague2(concreteMediator);
    
            concreteMediator.setConcreteColleague1(concreteColleague1);
            concreteMediator.setConcreteColleague2(concreteColleague2);
    
            concreteColleague1.send("吃饭没?");
            concreteColleague2.send("没有那,你请客?");
        }
    }
    

    (5)输出

    同事2接收到消息:吃饭没?
    同事1接收到消息:没有那,你请客?
    

    中介者模式的使用场景

    使用场景:
    一组定义良好的对象,现在要进行复杂的相互通信。
    想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

    中介者模式的优缺点

    优点:
    简化了对象之间的关系,将系统的各个对象之间的相互关系进行封装,将各个同事类解耦,使得系统变得松耦合。
    提供系统的灵活性,使得各个同事对象独立而易于复用。

    缺点:
    中介者模式中,中介者角色承担了较多的责任,所以一旦这个中介者对象出现了问题,整个系统将会受到重大的影响。
    新增一个同事类时,不得不去修改抽象中介者和具体中介者类,此时可以使用观察者模式和状态模式来解决这个问题。

    相关文章

      网友评论

          本文标题:中介者模式

          本文链接:https://www.haomeiwen.com/subject/rsonpqtx.html