设计模式(二)中介者设计模式

设计模式专栏

设计模式专栏

1.定义:

中介者模式(Mediator Pattern)是用来降低多个对象和类之间的通信复杂性。这种模式提供了一个中介类,该类通常处理不同类之间的通信,并支持松耦合,使代码易于维护。中介者模式属于行为型模式。

2.使用场景

中介者模式很容易实现呢,但是也容易误用,不要着急使用,先要思考你的设计是否合理。
当对象之间的交互变多时,为了防止一个类会涉及修改其他类的行为,可以使用中介者模式,将系统从网状结构变为以中介者为中心的星型结构。

3.UML图示

image.png

Mediator :抽象中介者角色,定义了同事对象到中介者对象的接口。
ConcreteMediator:具体中介者角色,它从具体的同事对象接收消息,向具体同事发出命令。
Colleague:抽象同事角色,定义了中介者对象接口,它只知道中介者而不知道其他同事对象。
ConcreteColleague:具体同事角色,每个具体同事类都知道自己在小范围内的行为,而不知道它在大范围内的目的。

4.中介者模式的简单实现

中介者模式可以拿武侠来举例,江湖中门派众多,门派之前因为想法不同会有很多的利益冲突,这样就会带来无休止的纷争。为了江湖的安宁,大家推举出了一个大家都认可的武林盟主来对江湖纷争进行调停。
前段时间武当派和峨眉派的的弟子被大力金刚指所杀,大力金刚指是少林派的绝学,因为事情重大,而且少林派实力强大,武当派和峨眉派不能够直接去少林派去问罪,只能上报武林盟主由武林盟主出面进行调停,如下图所示。

image.png
  • 抽象中介者角色
    首先我们创建抽象中介者类,在这个例子中,它是一个武林联盟类,如下所示。
public abstract class WulinAlliance {
 
    abstract void notice(String message,United united );
}

notice方法用于向门派发送通知,其中United为抽象同事类也就是门派类,接下来我们来创建它。

  • 抽象同事角色
public class United {

    protected WulinAlliance wulinAlliance;

    public United(WulinAlliance wulinAlliance) {
        this.wulinAlliance = wulinAlliance;
    }
}

门派类(抽象同事类)会在构造方法中得到武林联盟类(抽象中介者类)。

  • 具体同事角色

具体同事类包括武当派、峨眉派和少林派,如下所示。

public class Emei extends United {

    public Emei(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("峨眉收到消息:" + message);
    }
}

public class ShaoLin extends United {

    public ShaoLin(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("少林收到消息:" + message);
    }
}
public class Wudang extends United {

    public Wudang(WulinAlliance wulinAlliance) {
        super(wulinAlliance);
    }

    public void sendAlliance(String message) {
        wulinAlliance.notice(message, this);
    }

    public void getNotice(String message) {
        System.out.println("武当收到消息:" + message);
    }
}

武当、峨眉和少林类都有两个方法,其中getNotice方法是自有方法,对于其他的门派(同事类)和武林联盟(中介者)没有依赖,只是用来接收武林盟主的通知。sendAlliance方法则是依赖方法,它必须通过武林盟主才能完成行为。

  • 具体中介者角色
public class Champions extends WulinAlliance {
    private Wudang wudang;
    private ShaoLin shaolin;
    private Emei emei;
    public void setWudang(Wudang wudang) {
        this.wudang = wudang;
    }
    public void setEmei(Emei emei) {
        this.emei = emei;
    }
    public void setShaolin(ShaoLin shaolin) {
        this.shaolin = shaolin;
    }
    @Override
    public void notice(String message, United united) {
        if (united == wudang) {
            shaolin.getNotice(message);
        } else if (united == emei) {
            shaolin.getNotice(message);
        } else if (united == shaolin) {
            wudang.getNotice(message);
            emei.getNotice(message);
        }
    }
}

武林盟主需要了解所有的门派,所以需要用setter来持有武当、峨眉和少林的引用。notice方法会根据不同门派发来的消息,转而通知给其他的门派。比如武当发来的消息,武林盟主就会将消息通知给少林。

  • 客户端调用
public class Clinet {
    public static void main(String[] args) {

        Champions champions=new Champions();
        Wudang wudang=new Wudang(champions);
        ShaoLin shaolin=new ShaoLin(champions);
        Emei emei=new Emei(champions);
        champions.setWudang(wudang);
        champions.setShaolin(shaolin);
        champions.setEmei(emei);

        wudang.sendAlliance("武当弟子被少林大力金刚指所杀");

        emei.sendAlliance("峨眉弟子被少林大力金刚指所杀");

        shaolin.sendAlliance("少林弟子绝不会做出这种事情");

    }
}

首先创建武林盟主类Champions 并传入到各个门派类,接着调用武林盟主类的setter方法传入各个门派类,最后调用各个门派的sendAlliance方法通过武林盟主类向其他门派发送消息。

  • 得到如下结果:
    image.png

参考文献:
刘望舒的博客
Android源码设计模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 相关文章 设计模式(一)设计六大原则设计模式(二)单例模式的七种写法设计模式(三)建造者模式设计模式(四)简单工厂...
    刘望舒阅读 3,173评论 0 10
  • 1 场景问题# 1.1 如果没有主板## 大家都知道,电脑里面各个配件之间的交互,主要是通过主板来完成的(事实上主...
    七寸知架构阅读 2,234评论 0 56
  • 一 竹林追凶 凉州城外,雪竹林。 这里之所以被称为雪竹林,是因为凉州向来作为兵家要地而存在,古时在这附近过无数次战...
    风萧萧梦潇阅读 567评论 0 0
  • 从托管把儿子接回来,问他做完作业了吗?他很爽快地回答做完了。而且,很得意地说,你让我练的字也写完了。 我说好,一会...
    迟暮青春阅读 417评论 0 0
  • 五月是浪漫的,浪漫的五月总能营造出绚丽多姿的色彩,总能姿意出淡雅清新的情愫。虽不是温情下的缠绵悱恻,却依然能超脱...
    17计本3阅读 198评论 0 0