设计模式系列篇(二十二)——中介模式

今天,是设计模式系列篇的最后一篇文章,心情还有点小激动呢:)

What

中介者模式(Mediator Pattern),用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式,它是一种对象行为型模式。

Why

中介模式的设计思想跟中间层很像,通过引入中介这个中间层,将一组对象之间的交互关系(或者说依赖关系)从多对多(网状关系)转换为一对多(星状关系)。原来一个对象要跟 n 个对象交互,现在只需要跟一个中介对象交互,从而最小化对象之间的交互关系,降低了代码的复杂度,提高了代码的可读性和可维护性。

When

在以下情况下可以使用中介者模式:

  1. 系统中对象之间存在复杂的引用关系,产生的相互依赖关系结构混乱且难以理解。
  2. 一个对象由于引用了其他很多对象并且直接和这些对象通信,导致难以复用该对象。
  3. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。可以通过引入中介者类来实现,在中介者中定义对象。
  4. 交互的公共行为,如果需要改变行为则可以增加新的中介者类。

How

中介者模式包含如下角色:

  1. Mediator: 抽象中介者
  2. ConcreteMediator: 具体中介者
  3. Colleague: 抽象同事类
  4. ConcreteColleague: 具体同事类
中介者模式

今天,我们就使用中介者模式来实现一个聊天室系统。聊天室内用户可以发送文本消息,发送的文本消息对所有用户可见。借助中介者,用户可以把消息先发送给中介者,然后再由中介者发送给聊天室内的其他用户。

代码如下:
首先是,聊天室类,即中介者类。

public abstract class AbstractChatRoom {
    protected List<Member> memberList;

    public AbstractChatRoom() {
        this.memberList = new ArrayList<>();
    }

    public void register(Member member) {
        this.memberList.add(member);
    }

    public abstract void sendText(Member fromMember, String txt);
}

public class NormalChatRoom extends AbstractChatRoom {
    public NormalChatRoom() {
        super();
    }

    @Override
    public void sendText(Member fromMember, String txt) {
        // 遍历用户列表,接收消息
        for (Member member : this.memberList) {
            if (member == fromMember) {
                continue;
            }
            member.receiveText(fromMember, txt);
        }
    }
}

接下来是,用户类,即同事类。

public abstract class Member {
    protected String nickName;
    protected AbstractChatRoom chatRoom;

    public Member(String nickName, AbstractChatRoom chatRoom) {
        this.nickName = nickName;
        this.chatRoom = chatRoom;
        chatRoom.register(this);  // 直接调用注册方法,将用户对象添加至聊天室用户列表中。
    }

    public String getNickName() {
        return nickName;
    }

    public abstract void sendText(String txt);
    public abstract void receiveText(Member from, String txt);
}

public class NormalMember extends Member {

    public NormalMember(String nickName, AbstractChatRoom chatRoom) {
        super(nickName, chatRoom);
    }

    @Override
    public void sendText(String txt) {
        this.chatRoom.sendText(this, txt);  // 调用中介者,发送消息
    }

    @Override
    public void receiveText(Member fromMember, String txt) {
        System.out.println(String.format("%s receive a message from %s: %s", getNickName(), fromMember.getNickName(), txt));
    }
}

最后,建立一个聊天室,大家寒暄一下。

public class TestMain {
    public static void main(String[] args) {
        AbstractChatRoom chatRoom = new NormalChatRoom();
        Member member1 = new NormalMember("Jeremy", chatRoom);
        Member member2 = new NormalMember("Tom", chatRoom);
        Member member3 = new NormalMember("Amy", chatRoom);

        member1.sendText("hello every one!");
        member2.sendText("hi, how are you?");
        member3.sendText("hi, guys!");
    }
}

寒暄内容为:

Tom receive a message from Jeremy: hello every one!
Amy receive a message from Jeremy: hello every one!
Jeremy receive a message from Tom: hi, how are you?
Amy receive a message from Tom: hi, how are you?
Jeremy receive a message from Amy: hi, guys!
Tom receive a message from Amy: hi, guys!

代码地址

i-learning

写在最后

如果你觉得我写的文章帮到了你,欢迎点赞、评论、分享、赞赏哦,你们的鼓励是我不断创作的动力~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339