16.中介者模式(Mediator)
中介者模式又叫調停者模式,比如說租房中介,通過中介,租房者和房東之間就建立了很好的聯繫,中介者模式採用的就是這個道理,用一箇中介對象來封裝一系列的對象交互,中介者使各對象不需要顯式的相互引用。
哪裏會使用到中介者模式
目前軟件外包業務發達,很多人都在網上發佈軟件或項目外包的任務供軟件開發人員選擇,這種類型的網站就好像一箇中介一樣,類似還有淘寶,賣家可以在網上發佈需要售賣的商品,消費者可以進入網站查找自己需要購買的商品,淘寶在這就承擔了一箇中介的工作,如果遇到了買賣雙方的糾紛,淘寶還要承擔調停者的角色。
中介者模式的實現原理
中介者模式在消息隊列的實際應用
Messages
package mediator.app;
public interface Messages {
void send(String messageFrom, String messageTo);
void add(Message message);
}
MessagesImpl
package mediator.app;
import java.util.Map;
import java.util.HashMap;
public class MessagesImpl implements Messages {
private Map map = new HashMap();
public void send(String messageFrom, String messageTo) {
Message message1 = (Message) map.get(messageFrom);
Message message2 = (Message) map.get(messageTo);
message2.receiveMessage(message1);
}
public void add(Message message) {
message.setMessages(this);
map.put(message.getName(), message);
}
}
Message
package mediator.app;
public abstract class Message {
public void sendMessage(String messageFrom, String messageTo) {
messages.send(messageFrom, messageTo);
}
public abstract void receiveMessage(Message messageFrom);
public abstract String getName();
public Messages getMessages() {
return messages;
}
public void setMessages(Messages messages) {
this.messages = messages;
}
private Messages messages;
}
Message1
package mediator.app;
public class Message1 extends Message {
private String name;
public String getName() {
return "消息隊列1";
}
public void receiveMessage(Message message1) {
System.out.println(message1.getName() + "堵塞了" + getName());
}
}
Message2
package mediator.app;
public class Message2 extends Message {
private String name;
public String getName() {
return "消息隊列2";
}
public void receiveMessage(Message message1) {
System.out.println(message1.getName() + "堵塞了" + getName());
}
}
Client
package mediator.app;
public class Client {
public static void main(String[] argv) {
Messages messages = new MessagesImpl();
Message a = new Message1();
Message b = new Message2();
messages.add(a);
messages.add(b);
a.sendMessage("消息隊列1", "消息隊列2");
}
}
17.訪問者模式(Vistor)
把數據結構和作用於結構上的操作之間進行解耦,因爲增加一個新的操作就意味着增加一個新的訪問者,所以增加新的操作很容易。訪問者模式將有關的行爲集中到一個訪問者對象中。
哪裏會使用訪問者模式
類似銀行辦理業務,需要排號,銀行窗口叫號來辦理相應的業務。訪問者模式在呼叫中心也有着廣泛應用,當客戶打電話進去時,系統會自動尋找目前還在待機的電話,然後客戶與其接通。
比如超市會員,可分爲不打折會員、打9折會員、打8折會員。如果不用訪問者模式,則定義的訪問者類中要很多if語句判斷是哪種會員,再做操作。下面用訪問者模式實現此例:
訪問者模式的實現原理
訪問者模式在銀行排號系統的實際應用
Visitor
package vistor;
public class Visitor {
public void visit(Window window) {
window.service();
}
}
Window
public abstract class Window {
public void accept(Visitor visitor) {
visitor.visit(this);
}
public abstract void service();
}
Window1
public class Window1 extends Window {
@Override
public void service() {
System.out.println("1號窗口叫號");
}
}
Window2
public class Window2 extends Window {
@Override
public void service() {
System.out.println("2號窗口叫號");
}
}
Client
public class Client {
public static void main(String[] args) {
Window window1 = new Window1();
Window window2 = new Window2();
Visitor visitor = new Visitor();
visitor.visit(window1);
visitor.visit(window2);
}
}