设计模式-中介者模式

在我们的日常生活中经常需要购买各种各样的东西,房子、车子、生活用品等等。那么我们并不会对各个产品都了解,所以销售人员应运而生,他们了解产品,然后他们根据你的需求在向你们推荐符合你们要求的产品。这些销售人员就相当于中介,处于客户和产品之间,为你们搭桥牵线。这就是这篇需要讲述的一个设计模式-中介者模式。

介绍

从程序方面来讲,中介者模式就是各个对象封装,使他们不需要相互直接引用,而是通过中介者来通信。对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

如下图(图片来自大话设计模式)
图片来自大话设计模式
联合国就相当于中介者模式中的中介者
图片来自大话设计模式

结构图

这里写图片描述

案例

中介抽象类

public abstract class Mediator {
    public abstract void handleMsg(String msg,Colleague colleague);
}

抽象同事类

public abstract class Colleague {
    protected Mediator mediator;

    public Colleague(Mediator mediator) {
        this.mediator = mediator;
    }

    public abstract void getMsg(String msg);

    public abstract void sendMsg(String msg);
}

房东类(具体同事类)

public class Landlord extends Colleague {

    public Landlord(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void getMsg(String msg) {
        System.out.println("我是一名房东,今天我收到一条消息:"+msg);
    }

    @Override
    public void sendMsg(String msg) {
        mediator.handleMsg(msg, this);
    }


}

租客类(具体同事类)

public class Renter extends Colleague {

    public Renter(Mediator mediator) {
        super(mediator);
    }

    @Override
    public void getMsg(String msg) {
        System.out.println("我是一名租客,今天我收到一条消息:"+msg);
    }

    @Override
    public void sendMsg(String msg) {
        mediator.handleMsg(msg, this);
    }
}

房地产经纪人中介类

public class Realtor extends Mediator {

    private Landlord landlord;
    private Renter renter;

    public void setLandlord(Landlord landlord) {
        this.landlord = landlord;
    }



    public void setRenter(Renter renter) {
        this.renter = renter;
    }



    @Override
    public void handleMsg(String msg, Colleague colleague) {
        //如果消息是房东发过来的,那就转给租客,让租客知道有人出租房屋
        if (colleague.equals(landlord)) {
            renter.getMsg(msg);
        }

        //如果消息是租客发过来的,说明租客已经决定是否租赁房屋,把消息给房东(现实中没这必要。。。)
        if (colleague.equals(renter)) {
            landlord.getMsg(msg);
        }
    }

}

测试类

public class Client {

    public static void main(String[] args) {
        //中介
        Realtor realtor = new Realtor();

        //房东和租客同时找上了中介
        Landlord landlord = new Landlord(realtor);
        Renter renter = new Renter(realtor);

        realtor.setLandlord(landlord);
        realtor.setRenter(renter);

        landlord.sendMsg("有一套海景别墅要出租!!!");
        renter.sendMsg("太贵,租不起!");
    }

}

代码见Github地址

总结

如果在一个系统中对象之间的联系呈现为网状结构,也就是存在大量的多对多联系时就可以用中介者模式。通过使用中介者模式可以把原来的网状结构变成星形结构,最上面那两张图,联合国来作为中介,处理各国的事务。
中介者模式可以使对象之间的关系数量急剧减少,而且还承担这两方面的作用,一是中转作用,而是协调作用。通过中介者提供的中转作用,各个同事对象就不再需要显式引用其他同事,当需要和其他同事进行通信时,通过中介者即可。中介者可以更进一步的对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做,中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理,将同事成员之间的关系行为进行分离和封装。
通过使用中介者模式可以降低了类的复杂度,将一对多转化成了一对一,降低系统的耦合性。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值