深入浅出设计模式(十一):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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值