深入淺出設計模式(十一):16.中介者模式(Mediator) 17.訪問者模式(Vistor)

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);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章