Design Patterns教程-中介者模式
中介者模式的定义是“定义一个对象来封装一组对象之间的交互”。
我将通过考虑一个问题来解释中介者模式。当我们开始开发时,我们有几个类,这些类相互交互产生结果。现在,随着功能的增加,逻辑变得越来越复杂。然后会发生什么呢?我们添加更多的类,它们仍然相互交互,但维护这些代码变得非常困难。所以,中介者模式解决了这个问题。
中介者模式用于减少多个对象或类之间的通信复杂性。这个模式提供了一个中介者类,通常处理不同类之间的所有通信,并通过松散耦合支持代码的易维护性。
优点:
- 它减少了类的数量。
- 它简化了对象协议。
- 它将控制集中化。
- 单个组件变得更简单且更易于处理,因为它们不需要相互传递消息。
- 组件不需要包含处理相互通信的逻辑,因此它们更通用。
使用场景:
- 它常用于基于消息的系统,如聊天应用程序。
- 当一组对象以复杂但定义明确的方式进行通信时。
中介者模式的UML:
参与者:
- 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]