二、19【设计模式】之中介者模式

今天的博客主题

       设计模式 ——》 设计模式之中介者模式


中介者模式 MP (Mediator Pattern)

 

定义

用一个中介对象封装一系列的对象交互,中介者使各对象不需要显示的相互作用,达到耦合松散,独立的改变他们之间的交互。其主要是通过中介者解耦系统各层次对象的直接耦合,层次对象的对外依赖通信统统交由中介者转发。

在一个系统中如果对象之间的联系呈现为网状结构,那这些对象之间肯定存在大量的多对多联系,将导致系统非常复杂,这些对象既会影响别的对象,也会被别的对象所影响,这些对象称为同事对象,它们之间通过彼此的相互作用实现系统的行为。在网状结构中,几乎每个对象都需要与其他对象发生相互作用,而这种相互作用表现为一个对象与另外一个对象的直接耦合,这将导致一个过度耦合的系统。

 

简单说:中介者模式就是协调多个对象之间的交互。

 

应用场景

1)系统对象之间存在复杂的引用关系,产生的依赖关系结构混乱难以理解。

2)交互的公共行为,如需要改变行为则可以增加新的中介者类。

3)

中介者模式是用来降低多个对象之间的通信复杂性。提供一个中介类,将系统各层次对象间的多对多关系变成一对多关系。可将对象通信的复杂网状结构变成以调用者为中心的星状结构,达到降低系统的复杂度,提高扩展性。

在生活中也有这种场景,比如微信的朋友圈,群聊功能。房产中介等

 

优点

1)减少对象间的依赖,降低耦合性。

2)对象之间各司其职,符合迪米特法则。

3)

 

缺点

将原本多个对象的相互依赖变成了中介者和多个同事对象的依赖关系,当同事对象类越来越多的时候,中介者就会越臃肿,变得复杂且难以维护。

 

源码中的应用

JDK api
java.util.Timer 里的 schedule() 方法

 

代码示例

中介者模式主要有4个角色:

抽象中介者(Mediator):提供了同事对象注册与转发同事对象信息的抽象方法,定义统一接口,用于各个同事角色之间的通信。

具体中介者(ConcreteMediator):维护所有具体同事类,从具体的同事对象接收消息,向具体同事对象发出命令,协调各同事间的协作。

抽象同事类(Colleague):同事对象需要依赖的中介者角色,与其他同事对象间通信时,交给中介者进行转发协作。保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共方法。

具体同事类(ConcreteColleague):实现自己行为,转发依赖方法给中介者进行协调。

// 抽象中介者
interface Mediator{

    void register(Colleague colleague);

    void relay(Colleague colleague);

}

// 具体抽象者
class ConcreteMediator implements Mediator{

    private List<Colleague> colleagues = new ArrayList<>();

    @Override
    public void register(Colleague colleague) {
        if(!colleagues.contains(colleague)){
            colleagues.add(colleague);
            colleague.setColleague(this);
        }
    }

    @Override
    public void relay(Colleague colleague) {
        for (Colleague colleague1 : colleagues) {
            if(!colleague1.equals(colleague)){
                colleague1.receive();
            }
        }
    }
}

abstract class Colleague{

    protected Mediator mediator;

    public void setColleague(Mediator mediator){
        this.mediator = mediator;
    }

    abstract void receive();
    abstract void send();

}

class ConcreteColleague1 extends Colleague {

    @Override
    void receive() {
        System.out.println("ConcreteColleague1 收到请求");
    }

    @Override
    void send() {
        System.out.println("ConcreteColleague1 发出请求");
        mediator.relay(this); // 中介者转发请求
    }
}

class ConcreteColleague2 extends Colleague {

    @Override
    void receive() {
        System.out.println("ConcreteColleague2 收到请求");
    }

    @Override
    void send() {
        System.out.println("ConcreteColleague2 发出请求");
        mediator.relay(this); // 中介者转发请求
    }
}

// 客户端调用
public class MediatorPattern {

    public static void main(String[] args) {

        // 初始化中介者
        Mediator mediator = new ConcreteMediator();

        // 具体同事类,交互的对象
        Colleague c1 = new ConcreteColleague1();
        Colleague c2 = new ConcreteColleague2();

        // 中介者维护具体同事类
        mediator.register(c1);
        mediator.register(c2);

        // 某同事类发出请求
        c2.send();
    }
}

// 输出结果
ConcreteColleague1 发出请求
ConcreteColleague1 收到请求

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值