← 返回首页
设计模式基础教程(二十七)
发表时间:2021-08-28 12:12:10
中介者模式

1.中介者模式

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

在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责。

对于一个模块,可能由很多对象构成,而且这些对象之间可能存在相互的引用,为了减少对象两两之间复杂的引用关系,使之成为一个松耦合的系统,我们需要使用中介者模式,这就是中介者模式的模式动机。

中介者模式包含如下角色: - Mediator: 抽象中介者 - ConcreteMediator: 具体中介者 - Colleague: 抽象同事类 - ConcreteColleague: 具体同事类

2.实例

某论坛系统欲增加一个虚拟聊天室,允许论坛会员通过该聊天室进行信息交流,普通会员(CommonMember)可以给其他会员发送文本信息,钻石会员(DiamondMember)既可以给其他会员发送文本信息,还可以发送图片信息,也可以接收其它会员发来的信息和图片。该聊天室可以对不雅字符进行过滤,如“日”等字符;还可以对发送的图片大小进行控制。用中介者模式设计该虚拟聊天室。

项目结构图如下:

设计抽象聊天室类

public abstract class AbstractChatroom {
    public abstract void register(Member member);
    public abstract void sendText(String from,String to,String message);
    public abstract void sendImage(String from,String to,String message);
}

聊天室组类

public class ChatGroup extends AbstractChatroom {

    private Hashtable<String,Member> members=new Hashtable<String,Member>();
    @Override
    public void register(Member member) {
        if(!members.contains(member)){
            members.put(member.getName(),member);
            member.setChatroom(this);
        }
    }

    @Override
    public void sendText(String from, String to, String message) {
        Member member=members.get(to);
        String newMessage=message;
        newMessage=message.replace("日","*");
        member.receiveText(from, newMessage);
    }

    @Override
    public void sendImage(String from, String to, String image) {
        Member member=members.get(to);
        //模拟图片大小判断
        if(image.length()>5){
            System.out.println("图片太大,发送失败!");
        }else{
            member.receiveImage(from, image);
        }
    }
}

设计会员类

public abstract class Member {
    protected AbstractChatroom chatroom;
    protected String name;
    public Member(String name) {
        this.name = name;
    }
    public AbstractChatroom getChatroom() {
        return chatroom;
    }
    public void setChatroom(AbstractChatroom chatroom) {
        this.chatroom = chatroom;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public abstract void sendText(String to,String message);
    public abstract void sendImage(String to,String image);

    public void receiveText(String from,String message){
        System.out.println(from+"发送文本给"+this.name+",内容为:"+message);
    }

    public void receiveImage(String from,String image){
        System.out.println(from+"发送图片给"+this.name+",内容为:"+image);
    }
}

普通会员类

public class CommonMember extends Member {
    public CommonMember(String name) {
        super(name);
    }
    @Override
    public void sendText(String to, String message) {
        System.out.println("普通会员发送消息:");
        chatroom.sendText(this.name, to, message);//发送消息
    }
    @Override
    public void sendImage(String to, String image) {
        System.out.println("普通会员不能发送图片!");
    }
}

钻石会员类

public class DiamondMember extends Member {

    public DiamondMember(String name) {
        super(name);
    }

    @Override
    public void sendText(String to, String message) {
        System.out.println("钻石会员发送消息:");
        chatroom.sendText(this.name, to, message);//发送消息
    }

    @Override
    public void sendImage(String to, String image) {
        System.out.println("钻石会员发送图片:");
        chatroom.sendImage(this.name, to, image);
    }
}

测试类

public class MediatorDemo01 {

    public static void main(String[] args) {
        AbstractChatroom happyChat=new ChatGroup();

        Member member1,member2,member3,member4,member5;
        member1=new DiamondMember("钻石会员张三");
        member2=new DiamondMember("钻石会员李四");

        member3=new CommonMember("普通会员王五");
        member4=new CommonMember("普通会员小芳");
        member5=new CommonMember("普通会员小红");

        happyChat.register(member1);
        happyChat.register(member2);
        happyChat.register(member3);
        happyChat.register(member4);
        happyChat.register(member5);

        member1.sendText(member2.getName(), member2.getName()+",你好!");
        member2.sendText(member1.getName(), member1.getName()+",你好!");

        member1.sendText(member2.getName(), "今天天气不错,有日!");
        member2.sendText(member1.getName(), "一个很大很大的太阳!");
        member2.sendImage(member1.getName(), "太阳");

        member3.sendText(member4.getName(), "还有问题吗?");
        member3.sendText(member5.getName(), "还有问题吗?");

        member4.sendText(member3.getName(), "没有了,谢谢!");
        member5.sendText(member3.getName(), "我也没有了!");
        member5.sendText(member3.getName(), "谢谢!");
    }
}

运行结果:
钻石会员发送消息:
钻石会员张三发送文本给钻石会员李四,内容为:钻石会员李四,你好!
钻石会员发送消息:
钻石会员李四发送文本给钻石会员张三,内容为:钻石会员张三,你好!
钻石会员发送消息:
钻石会员张三发送文本给钻石会员李四,内容为:今天天气不错,有*!
钻石会员发送消息:
钻石会员李四发送文本给钻石会员张三,内容为:一个很大很大的太阳!
钻石会员发送图片:
钻石会员李四发送图片给钻石会员张三,内容为:太阳
普通会员发送消息:
普通会员王五发送文本给普通会员小芳,内容为:还有问题吗?
普通会员发送消息:
普通会员王五发送文本给普通会员小红,内容为:还有问题吗?
普通会员发送消息:
普通会员小芳发送文本给普通会员王五,内容为:没有了,谢谢!
普通会员发送消息:
普通会员小红发送文本给普通会员王五,内容为:我也没有了!
普通会员发送消息:
普通会员小红发送文本给普通会员王五,内容为:谢谢!