2021年9月29日-设计模式之中介者模式

第十九章:中介者模式

一、模式简介

随着系统越做越大,我们的类也越来越多。每个类或多或少会调用另外几个类中的方法。如下图:

在这里插入图片描述

可以说是相当杂乱的,尤其是这些调用关系是分散在各个类中

所以为了是各个类解耦,我们将这些逻辑调用独立出来放到一个叫中介者的类中。中介者这个类就规定了这些同事类的调用关系。所以一旦一个同事类需要调用另一个同事类的方法,只需发消息给中介者类,由中介者类来调用另一个同事类的方法。

所以现在的关系就像下图:

在这里插入图片描述

所以中介者这个类会很复杂,不好写

二、模式实例

让我们看一个猫和铲屎官的例子,猫和人都有自己的功能,其中有些功能依赖与对方

Colleague 顶层父类

public abstract class Colleague {
    private Mediator mediator;

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

    void sendMessage(int state, Colleague colleague) {
        this.mediator.getMessage(state, colleague);
    }
}

具体同事类

public class Cat extends Colleague {

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

    public void needCleanShit() {
        System.out.println("宠物猫: 好多屎啊...");
        sendMessage(ColleagueState.ClEANSHIT, this);
    }

    public void hungry() {
        System.out.println("宠物猫: 又饿了, 需要猫粮喵");
        sendMessage(ColleagueState.HUNGRY, this);
    }

    public void work() {
        System.out.printf("宠物猫: 该工作了...");
    }
}
public class Master extends Colleague {
    public Master(Mediator mediator) {
        super(mediator);
    }

    public void cleanShit() {
        System.out.println("铲屎官: 该铲屎了╮(╯-╰)╭");
    }

    public void pourCatFood() {
        System.out.println("铲屎官: 猫粮又没了!去倒猫粮");
    }

    public void strokeCat() {
        System.out.println("铲屎官: 该休息一会了, 我的猫呢...");
        sendMessage(ColleagueState.STROKECAT, this);
    }
}

中介者顶层父类 Mediator

public interface Mediator {
    void register(Colleague colleague);
    void getMessage(int state, Colleague colleague);
}

中介者类的具体实现

public class ConcreteMediator implements Mediator {
    Cat cat;
    Master master;

    @Override
    public void register(Colleague colleague) {
        if (colleague instanceof Cat) {
            cat = (Cat) colleague;
        } else {
            master = (Master) colleague;
        }
    }

    @Override
    public void getMessage(int state, Colleague colleague) {
        switch (state) {
            case ColleagueState.STROKECAT:
                cat.work();
                break;
            case ColleagueState.ClEANSHIT:
                master.cleanShit();
                break;
            case ColleagueState.HUNGRY:
                master.pourCatFood();
                break;
        }
    }
}

状态类

public class ColleagueState {
    public static final int STROKECAT = 0;
    public static final int ClEANSHIT = 1;
    public static final int HUNGRY = 2;
}

测试类

public class MediatorTest {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Cat cat = new Cat(mediator);
        Master master = new Master(mediator);
        cat.hungry();
        cat.needCleanShit();
        master.strokeCat();
    }
}


/********** result 
宠物猫: 又饿了, 需要猫粮喵
铲屎官: 猫粮又没了!去倒猫粮
宠物猫: 好多屎啊...
铲屎官: 该铲屎了╮(╯-╰)╭
铲屎官: 该休息一会了, 我的猫呢...
宠物猫: 该工作了...
result **********/

三、模式总结

优点:

  • 将各个同事类解耦,符合迪米特法则

缺点:

  • 中介者承担太多逻辑调用,所以中介者一旦出现问题,整个系统就会收到影响
  • 如果设计不当,中介者对象会变得过于复杂
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值