【openfire插件开发】群组聊天中的中介者模式

原文链接:http://www.hechunchen.info/?p=54

 

生活中的中介者非常常见,比如维护世界和平的联合国组织、房屋中介、出国中介。那么,设计模式中的中介者模式是怎么样的呢?我们openfire中的群组聊天就是a typical example。我们用一个简化的群组聊天模型来说明mediator(中介者)模式。  

我们的考虑是这样的,我们在用户之间添加中介者——聊天室。这样的话,用户之间的耦合度就会降低,而且不需要相互引用。它们只需独立地跟中介者交互即可。 结构图如下:

下面贴上关键代码。 接口IChatroom.java:

package mediator;
 
public interface IChatroom
{
    void forward(User from, User to, String message);
}

 

Chatroom.java:

package mediator;
 
public class Chatroom implements IChatroom
{
 
    @Override
    public void forward(User from, User to, String message)
    {
        // TODO Auto-generated method stub
        if(to!=null)
        {
            to.receive(from, message);
        }
    }
}

 

抽象类User.java:

package mediator;
 
public abstract class User
{
    IChatroom room;
 
    public User(IChatroom room)
    {
        this.room = room;
    }
 
    public abstract void send(User to, String message);
    public abstract void receive(User from, String message);
}

 

MaleUser.java:

package mediator;
 
public class MaleUser extends User
{
 
    public MaleUser(IChatroom room)
    {
        super(room);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void receive(User from, String message)
    {
        // TODO Auto-generated method stub
        System.out.println("帅哥我收到了:" + message);
    }
 
    @Override
    public void send(User to, String message)
    {
        // TODO Auto-generated method stub
        room.forward(this, to, message);
    }
 
}

 

FemaleUser.java:

package mediator;
 
public class FemaleUser extends User
{
 
    public FemaleUser(IChatroom room)
    {
        super(room);
        // TODO Auto-generated constructor stub
    }
 
    @Override
    public void receive(User from, String message)
    {
        // TODO Auto-generated method stub
        System.out.println("美女我收到了:" + message);
    }
 
    @Override
    public void send(User to, String message)
    {
        // TODO Auto-generated method stub
        room.forward(this, to, message);
    }
 
}

 

测试类TestClient.java:

package mediator;
 
public class TestClient
{
 
    /**
     * @param args
     */
    public static void main(String[] args)
    {
        // TODO Auto-generated method stub
        IChatroom room = new Chatroom();
        FemaleUser hcc = new FemaleUser(room);
        MaleUser fq = new MaleUser(room);
        MaleUser gq = new MaleUser(room);
        MaleUser lp = new MaleUser(room);
 
        //男给男发消息
        gq.send(fq, "吃饭了没?");
        //男给女发消息
        lp.send(hcc, "我也没吃饭");
 
    }
}

 

总结一下,Mediator改变了原来两个对象的耦合方式

posted @   ErinFlyingFish  阅读(4268)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示