中介者模式

时间:2019-11-17 16:54:38   收藏:0   阅读:94

2019年11月11日08:45:25

中介者模式(mediator pattern)

定义

从前的日色变得慢

车,马,邮件都慢

一生只够爱一个人

中介者模式(mediator pattern),用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们的交互。————《设计模式:可复用面向对象软件的基础》

中介者模式是一种对象行为型模式。

从木心这首小诗中的“邮件”中,讨论一下中介者模式。

很久很久以前,你和她住在一个很大很大的村子里面,你住在村的东边,她住在村的西边。

那年你才十八,她也正值青春年华,正月十五元宵节,你赏灯之时,她回首处,你一见钟情。

往后的日子里,你每天都到她家送情书。送了99天,你想这不是办法,每天大半天浪费在路上,没时间赚钱。于是你想了一个办法,创办邮局,每天替村东边的人送信件给村西边的人,一举两得。慢慢邮局越来越大,南边的人通过邮局来给北边的人送信件,你找了几个伙计,从南到北,从北到南送信。

多年后,你富甲一方,也娶了当年的她。

“邮局”就是中介者模式中的中介者,“你”和“她”就是中介者中的同事。

图示

中介者模式结构图:

技术分享图片

角色

从中介者模式结构图中可知,有以下4个角色:

代码示例

这是一个悲伤的故事,住在村东边的你通过邮局给村西边的她表白,她说,她已经有男朋友了。

类图:

技术分享图片

抽象中介者角色:

public interface PostOffice {
    /**
     * 送信
     */
    void deliverLetters(String letters, String receiver);

    /**
     * 添加收信人
     */
    void addPeople(Villager villager);
}

具体中介者角色:

public class PostOfficeImpl implements PostOffice {
    /**
     * 收信人信息
     */
    private HashMap villagerMap = new HashMap<String, Villager>();

    @Override
    public void addPeople(Villager villager) {
        villagerMap.put(villager.getClass().getSimpleName(), villager);
    }

    @Override
    public void deliverLetters(String letters, String receiver) {
        System.out.println("=>收信:邮局收到要寄的信");
        Villager villager = (Villager) villagerMap.get(receiver);
        System.out.println("=>送信:拿出地址本查询收信人地址是:" + villager.getAddress() + ",送信");
        System.out.println("=>收信人看信:");
        villager.receiveLetter(letters);
    }
}

抽象同事类角色:

public abstract class Villager {
    protected PostOffice postOffice;
    protected String address;

    Villager(PostOffice postOffice, String address) {
        this.postOffice = postOffice;
        this.address = address;
    }

    public void receiveLetter(String letter) {
        System.out.println(letter);
    }

    public void sendLetter(String letter, String receiver) {
        postOffice.deliverLetters(letter, receiver);
    }

    public String getAddress() {
        return address;
    }
}

具体同事类角色:

// 她
public class She extends Villager {

    She(PostOffice postOffice, String address) {
        super(postOffice, address);
    }
}
// 你
public class You extends Villager {
    public You(PostOffice postOffice, String address) {
        super(postOffice, address);
    }
}

中介者模式测试类:

public class MediatorPatternTest {
    public static void main(String[] args) {
        PostOffice postOffice = new PostOfficeImpl();
        She she = new She(postOffice, "村西边");
        You you = new You(postOffice, "村东边");

        postOffice.addPeople(she);
        postOffice.addPeople(you);

        you.sendLetter("正月十五,元宵之夜,一见倾心", "She");
        she.sendLetter("对不起,我已经有男朋友了", "You");
    }
}

测试结果:

技术分享图片

使用场景

村子很大,人很多,关系很复杂:系统中存在很多对象,对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解,使得对象无法重用

人与人之间书信交流:对象间存在某种共性交互行为,用中介者封装这种行为

在这个很大的村子里面,每个人要给不同人的送信,这种关系成网状结构,错综复杂。

技术分享图片

加入邮局中介者之后,成星状结构,每个人只和邮局有关系。

技术分享图片

总结:系统中存在很多对象,对象间存在复杂的关系,在复杂的关系中存在共性交互行为,封装共性交互行为就是中介者。

中介者模式很容易在系统中应用,也很容易在系统中无用。当系统出现了“多对多”交互复杂的对象群是,不要急于使用中介者模式,而要先反思你的系统在设计上是不是合理。

实例有:联合国,聊天室等。

中介者模式与迪米特法则

中介者模式是应用迪米特法则的典型。

迪米特法则:只与你最直接的朋友交流(Only talk to you immediate friends.)参考设计模式六大原则

优点

缺点

总结

中介者模式,用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地互相引用,从而使其耦合松散,而且可以独立地改变它们的交互。

2019年11月17日16:32:36

原文:https://www.cnblogs.com/mingmingcome/p/11876954.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!