设计模式系列篇Android

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

2020-09-12  本文已影响0人  复旦猿

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

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

写在最后

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

上一篇 下一篇

猜你喜欢

热点阅读