【設計模式 - 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】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章