中介者模式的定义是“定义一个对象来封装一组对象之间的交互”。

我将通过考虑一个问题来解释中介者模式。当我们开始开发时,我们有几个类,这些类相互交互产生结果。现在,随着功能的增加,逻辑变得越来越复杂。然后会发生什么呢?我们添加更多的类,它们仍然相互交互,但维护这些代码变得非常困难。所以,中介者模式解决了这个问题。

中介者模式用于减少多个对象或类之间的通信复杂性。这个模式提供了一个中介者类,通常处理不同类之间的所有通信,并通过松散耦合支持代码的易维护性。

优点:

  • 它减少了类的数量。
  • 它简化了对象协议。
  • 它将控制集中化。
  • 单个组件变得更简单且更易于处理,因为它们不需要相互传递消息。
  • 组件不需要包含处理相互通信的逻辑,因此它们更通用。

使用场景:

  • 它常用于基于消息的系统,如聊天应用程序。
  • 当一组对象以复杂但定义明确的方式进行通信时。

中介者模式的UML:

5-1.png

参与者:

  • ApnaChatroom: 定义与参与者交互的接口。
  • ApnaChatroomImpl: 实现Chatroom接口定义的操作。这些操作管理对象之间的交互:当一个参与者发送消息时,消息会发送给其他参与者。
  • Participant: 定义聊天用户的接口。
  • User1, User2, ...UserN: 实现Participant接口;参与者可以是参与聊天的多个用户。但每个参与者只会保持对ApnaChatRoom的引用。

中介者模式的实现:

步骤 1:

创建一个ApnaChatRoom接口。

// 这是一个接口
public interface ApnaChatRoom { 
    public void showMsg(String msg, Participant p); 
}

步骤 2:

创建一个实现ApnaChatRoom接口的ApnaChatRoomImpl类,并且会使用通过Participant接口进行聊天的参与者。

// 这是一个类
import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 

public class ApnaChatRoomImpl implements ApnaChatRoom { 
    // 获取当前日期时间  
    DateFormat dateFormat = new SimpleDateFormat("E dd-MM-yyyy hh:mm a"); 
    Date date = new Date(); 
    
    @Override 
    public void showMsg(String msg, Participant p) { 
        System.out.println(p.getName() + " gets message: " + msg); 
        System.out.println("\t\t\t\t[" + dateFormat.format(date).toString() + "]");  
    }   
}

步骤 3:

创建一个Participant抽象类。

// 这是一个抽象类
public abstract class Participant { 
    public abstract void sendMsg(String msg); 
    public abstract void setname(String name); 
    public abstract String getName(); 
}

步骤 4:

创建一个扩展Participant抽象类并使用ApnaChatRoom接口的User1类。

// 这是一个类
public class User1 extends Participant { 
    private String name; 
    private ApnaChatRoom chat; 
    
    @Override 
    public void sendMsg(String msg) { 
        chat.showMsg(msg, this); 
    } 
    
    @Override 
    public void setname(String name) { 
        this.name = name; 
    } 
    
    @Override 
    public String getName() { 
        return name; 
    } 
    
    public User1(ApnaChatRoom chat) { 
        this.chat = chat; 
    }   
}

步骤 5:

创建一个扩展Participant抽象类并使用ApnaChatRoom接口的User2类。

// 这是一个类
public class User2 extends Participant { 
    private String name; 
    private ApnaChatRoom chat; 
    
    @Override 
    public void sendMsg(String msg) { 
        this.chat.showMsg(msg, this); 
    } 
    
    @Override 
    public void setname(String name) { 
        this.name = name; 
    } 
    
    @Override 
    public String getName() { 
        return name; 
    } 
    
    public User2(ApnaChatRoom chat) { 
        this.chat = chat; 
    } 
}

步骤 6:

创建一个使用聊天参与者的MediatorPatternDemo类。

// 这是一个类
public class MediatorPatternDemo { 
    public static void main(String args[]) { 
        ApnaChatRoom chat = new ApnaChatRoomImpl(); 
        
        User1 u1 = new User1(chat); 
        u1.setname("Ashwani Rajput"); 
        u1.sendMsg("Hi Ashwani! how are you?"); 
        
        User2 u2 = new User2(chat); 
        u2.setname("Soono Jaiswal"); 
        u2.sendMsg("I am Fine! You tell?"); 
    } 
}

输出:

Ashwani Rajput gets message: Hi Ashwani! how are you?
[Tue 18-02-2020 12:35 PM]
Soono Jaiswal gets message: I am Fine! You tell?
[Tue 18-02-2020 12:35 PM]

标签: Design Patterns, Design Patterns教程, 设计模式, 软件设计, 结构型模式, 行为型模式, 单例模式, 工厂模式, 观察者模式, 中介者模式, 访问者模式