Android开发经验谈Android开发Android技术知识

中介者模式

2019-05-14  本文已影响10人  Jackson杰

一 定义

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

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

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

二 模式结构

角色介绍:

三 实例

通用代码:

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();

四 优缺点

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

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

上一篇 下一篇

猜你喜欢

热点阅读