中介者模式

作者: Jackson杰 | 来源:发表于2019-05-14 11:53 被阅读10次

    一 定义

    中介者模式也称为调停者模式或者调解者模式,在生活中比较常见的房地产中介,房地产中介在买房者和卖房者中间建立起一座桥梁,买家和卖家通过中介来了解各自的需求,可能如果不到交易阶段,买家和卖家都不会见面。

    定义:中介者模式包装了一系列对象相互作用的方式,使得这些对象不必相互明显作用。从而使它们可以松散耦合。当某些对象之间的作用发生改变时,不会立即影响其他的一些对象之间的作用。保证这些作用可以彼此独立的变化。中介者模式将多对多的相互作用转化为一对多的相互作用。中介者模式将对象的行为和协作抽象化,把对象在小尺度的行为上与其他对象的相互作用分开处理。

    中介者的本质,封装交互。

    二 模式结构

    角色介绍:

    • Mediator:抽象中介者角色,定义了同事对象到中介者对象的接口,一般以抽象类的方式实现。
    • ConcreteMediator:具体的中介者角色,继承自抽象中介者,实现了抽象中介者中定义的方法,从具体同事对象中接收消息,向具体的同事对象发出命令。
    • Colleague:抽象同事类角色,定义了中介者对象的接口,它只知道中介者而不知道其他的同事对象。
    • ConcreteColleagueA/B:具体同事类角色,继承自抽象同事类。

    三 实例

    通用代码:

    • 抽象中介者
    public abstract class Mediator {
    
        protected ConcreteColleagueA mConcreteColleagueA;
        protected ConcreteColleagueB mConcreteColleagueB;
    
        /**
         * 抽象的中介方法,由子类实现
         */
        public abstract void method();
    
    
        public void setConcreteColleagueA(ConcreteColleagueA concreteColleagueA) {
            mConcreteColleagueA = concreteColleagueA;
        }
    
        public void setConcreteColleagueB(ConcreteColleagueB concreteColleagueB) {
            mConcreteColleagueB = concreteColleagueB;
        }
    }
    
    • 具体中介者
    public class ConcreteMediator extends Mediator{
    
        @Override
        public void method() {
            mConcreteColleagueA.action();
            mConcreteColleagueB.action();
        }
    }
    
    • 抽象同事
    public abstract class Colleague {
    
        protected Mediator mMediator;   // 中介者对象
    
        public Colleague(Mediator mediator){
            this.mMediator=mediator;
        }
    
        /**
         * 同事的具体行为,由子类去实现
         */
        public abstract void action();
    
    }
    
    • 具体同事
    public class ConcreteColleagueA extends Colleague{
    
    
        public ConcreteColleagueA(Mediator mediator) {
            super(mediator);
        }
    
        @Override
        public void action() {
            System.out.println("ColleagueA将信息传递给中介者处理");
        }
    }
    
    
    public class ConcreteColleagueB extends Colleague{
    
        public ConcreteColleagueB(Mediator mediator) {
            super(mediator);
        }
    
        @Override
        public void action() {
            System.out.println("ColleagueB将信息传递给中介者处理");
        }
    }
    
    • 测试代码
    // 构造中介者
            ConcreteMediator concreteMediator=new ConcreteMediator();
            // 构造两个同事
            ConcreteColleagueA concreteColleagueA=new ConcreteColleagueA(concreteMediator);
            ConcreteColleagueB concreteColleagueB=new ConcreteColleagueB(concreteMediator);
            // 为中介者设置同事
            concreteMediator.setConcreteColleagueA(concreteColleagueA);
            concreteMediator.setConcreteColleagueB(concreteColleagueB);
            // 执行中介方法
            concreteMediator.method();
    

    下面,我们以具体的实例分析,我们以房子的交易流程为例。现在我们有很多app都是专门的房屋交易app,买家和卖家在app上注册,注册完成以后,买家和卖家是不能直接进行交流的,这时需要一个房地产的中介,买家可以就感兴趣的房子向中介咨询,中介接收到信息以后,如果不能确定的,就去找卖家咨询,然后再转发给买家,最终在中介的参与下完成交易。具体代码如下:

    • 抽象的客户类
      定义了一个客户基本的方法,如注册,发送消息,接收消息等。
    public abstract class Customer {
    
        protected HouseMediator mHouseMediator; // 持有一个中介者对象
    
        public Customer(HouseMediator houseMediator){
            this.mHouseMediator=houseMediator;
        }
    
        //注册
        public abstract void register();
    
        //发送消息
        public abstract void sendMes();
    
        //接收消息
        public abstract void receiverMsg();
    
    
        //接收消息
        public abstract void action();
    
    }
    
    • 具体的客户
    public class CustomerBuyer extends Customer {
    
        public CustomerBuyer(HouseMediator houseMediator) {
            super(houseMediator);
        }
    
        @Override
        public void register() {
            System.out.println("注册为买家-小明");
        }
    
        @Override
        public void sendMes() {
            System.out.println("买家咨询房子的信息");
        }
    
        @Override
        public void receiverMsg() {
            System.out.println("买家接收房子的信息");
        }
    
        @Override
        public void action() {
            System.out.println("买家付钱");
        }
    }
    
    
    
    
    
    public class CustomerSeller extends Customer {
    
        public CustomerSeller(HouseMediator houseMediator) {
            super(houseMediator);
        }
    
        @Override
        public void register() {
            System.out.println("注册为卖家-小华");
        }
    
        @Override
        public void sendMes() {
            System.out.println("卖家咨发送房子的信息");
        }
    
        @Override
        public void receiverMsg() {
            System.out.println("卖家接收房子的咨询信息");
        }
    
        @Override
        public void action() {
            System.out.println("卖家收钱");
        }
    }
    
    
    • 抽象的中介者
    public abstract class HouseMediator {
    
    
        protected CustomerBuyer mCustomerBuyer;   // 买家对象
        protected CustomerSeller mCustomerSeller;  // 卖家对象
    
        /**
         * 抽象的中介方法,模拟房子的交易过程,由子类实现
         */
        public abstract void method();
    
    
        public void setCustomerBuyer(CustomerBuyer customerBuyer) {
            mCustomerBuyer = customerBuyer;
        }
    
        public void setCustomerSeller(CustomerSeller customerSeller) {
            mCustomerSeller = customerSeller;
        }
    }
    
    • 具体的中介者
    public class LianJiaHouseMediator extends HouseMediator{
    
        @Override
        public void method() {
            mCustomerBuyer.register();
            mCustomerSeller.register();
            mCustomerBuyer.sendMes();
            mCustomerSeller.receiverMsg();
            mCustomerSeller.sendMes();
            mCustomerBuyer.receiverMsg();
            mCustomerBuyer.action();
            mCustomerSeller.action();
        }
    }
    
    • 测试代码
    // 构造链家的房地产中介
            LianJiaHouseMediator lianJiaHouseMediator=new LianJiaHouseMediator();
            // 构造买家和卖家
            CustomerBuyer buyer=new CustomerBuyer(lianJiaHouseMediator);
            CustomerSeller seller=new CustomerSeller(lianJiaHouseMediator);
            // 为买家和卖家设置中介
            lianJiaHouseMediator.setCustomerBuyer(buyer);
            lianJiaHouseMediator.setCustomerSeller(seller);
            // 模拟交易过程
            lianJiaHouseMediator.method();
    
    • 运行结果


    四 优缺点

    优点:减少了类之间的依赖,同事类只依赖于中介,降低了类之间的耦合。
    缺点:如果同事类过多,因为同事类依赖中介,会造成中介者膨胀很大,逻辑会很复杂。

    使用场景:中介者模式适用于多个对象存在紧密耦合的情况。

    相关文章

      网友评论

        本文标题:中介者模式

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