美文网首页设计模式系列篇Android
设计模式系列篇(二十二)——中介模式

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

作者: 复旦猿 | 来源:发表于2020-09-12 16:54 被阅读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

    写在最后

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

    相关文章

      网友评论

        本文标题:设计模式系列篇(二十二)——中介模式

        本文链接:https://www.haomeiwen.com/subject/pyolektx.html