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);
}
}