【设计模式 - 17】之中介者模式(Mediator)

1      模式简介

中介者模式的定义:

用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显式地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

 

中介者模式中的组成部分:

1.        同事类:如果两个类对象之间可以彼此影响,则称这两个类为同事类;

2.        中介者:中介者中有所有同事类的引用,定义了各个同事类之间交互的抽象方法。

 

中介者模式的工作方式:

如下两幅图所示,有6个同事类,它们之间的交互方式如下图所示。这样的话,当对象1发生变化,将影响对象2、4、5、6;当对象2发生变化时,将影响对象1、3、4、5、6。这样不仅实现起来麻烦,而且不易于维护。


如果引入中介者,其工作情况将如下图所示。可以看到,同事类之间两两都没有了关联,都是与中介者联系了。

 

中介者模式的优点:

1)        降低了类的复杂度,将一对多转化成了一对一;

2)        各个类之间的解耦;

3)        符合对象之间“高内聚、低耦合”的原则。

 

中介者模式的缺点:

中介者会庞大,变得复杂难以维护。

 

中介者模式的使用场景:

1)        当系统中对象之间存在比较复杂的引用关系,导致它们之间的依赖关系结构混乱而且难以复用该对象时;

2)        当希望通过一个中间类来封装多个类中的行为,而又不想生成太多的子类时。

 

2      案例

在这个案例中,我们模拟一个聊天室的功能:

1)        创建一个聊天室;

2)        向聊天室中添加用户;

3)        当某一个用户发布消息的时候,其他用户都可以收到消息。


具体代码如下:

用户类User中的代码:

public class User {
	private String name;

	public User(String name) {
		this.name = name;
	}

	public String getName() {
		return name;
	}

	public void sendMessage(ChatRoom chatRoom, String message) {
		System.out.println(name + "发出消息:" + message);
		chatRoom.operateMessage(new Message(this, message));
	}
}
消息类Message中的代码:

public class Message {
	private User fromUser;
	private String content;

	public Message() {
	}

	public Message(User fromUser, String content) {
		this.fromUser = fromUser;
		this.content = content;
	}

	public User getFromUser() {
		return fromUser;
	}

	public void setFromUser(User fromUser) {
		this.fromUser = fromUser;
	}

	public String getContent() {
		return content;
	}

	public void setContent(String content) {
		this.content = content;
	}
}
聊天室类ChatRoom中的代码:

public class ChatRoom {
	private List<User> users;

	public ChatRoom() {
		System.out.println("聊天室开启!!");
		users = new ArrayList<User>();
	}

	public void addUser(User user) {
		System.out.println(user.getName() + "加入了聊天室!");
		users.add(user);
	}

	public void operateMessage(Message message) {
		User fromUser = message.getFromUser();
		for (User user : users) {
			if (fromUser != user) {
				System.out.println(user.getName() + "收到了来自" + fromUser.getName() + "的消息:" + message.getContent());
			}
		}
	}
}
测试类Test中的代码:

public class Test {
	public static void main(String[] args) {
		// 初始化聊天室对象
		ChatRoom chatRoom = new ChatRoom();
		// 向聊天室中添加用户
		User chatter1 = new User("Chatter1");
		User chatter2 = new User("Chatter2");
		User chatter3 = new User("Chatter3");
		User chatter4 = new User("Chatter4");
		User chatter5 = new User("Chatter5");
		User chatter6 = new User("Chatter6");
		chatRoom.addUser(chatter1);
		chatRoom.addUser(chatter2);
		chatRoom.addUser(chatter3);
		chatRoom.addUser(chatter4);
		chatRoom.addUser(chatter5);
		chatRoom.addUser(chatter6);
		System.out.println();
		// 用户之间开始交流
		chatter1.sendMessage(chatRoom, "大家好,我是Chatter1");
		System.out.println();
		chatter4.sendMessage(chatRoom, "你好,Chatter1");
	}
}
运行结果如下图所示:



最后贴出中介者模式的GitHub代码地址:【GitHub - Mediator】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值