中介者模式(Mediator)

中介者模式(Mediator)

1.意图

用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
在下列情况下使用中介者模式 :
• 一组对象以定义良好但是复杂的方式进行通信。产生的相互依赖关系结构混乱且难以理解。
• 一个对象引用其他很多对象并且直接与这些对象通信 ,导致难以复用该对象。
• 想定制一个分布在多个类中的行为,而又不想生成太多的子类。

2.特点

• Mediator(中介者 )
— 中介者定义一个接口用于与各同事(Colleague)对象通信。
• ConcreteMediator(具体中介者)
— 具体中介者通过协调各同事对象实现协作行为。
— 了解并维护它的各个同事。
• Colleague class(同事类)
— 每一个同事类都知道它的中介者对象。
— 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。

同事向一个中介者对象发送和接收请求。中介者在各同事间适当地转发请求以实现协作行为。

3.UML类图

中介者模式

4.代码

/**
 * Mediator(中介者 )
 — 中介者定义一个接口用于与各同事(Colleague)对象通信。
 */
public interface Mediator {
    void contact(String message,Colleague coll);
}
/**
 * ConcreteMediator(具体中介者)
 — 具体中介者通过协调各同事对象实现协作行为。
 — 了解并维护它的各个同事。
 */
public class ConcreteMediator implements Mediator {
    private List<Colleague> list = new ArrayList<Colleague>();

    public void addColleague(Colleague colleague){
        list.add(colleague);
    }

    /**
     * 中介者联系具体的同事类.将消息发送给同事类
     * @param message
     * @param coll
     */
    @Override
    public void contact(String message, Colleague coll) {

        for(Colleague colleague:list){
            if(colleague!=coll)
                colleague.getMessage(message);
        }
    }
}

/**
 * 抽象同事类
 * 每个同事类必须持有自己的中介者.
 */
public abstract class Colleague {
    protected String name;
    protected Mediator mediator;

    public Colleague(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public abstract void getMessage(String message);

    public abstract void contact(String message);
}
/**
 * Colleague class(同事类)
 — 每一个同事类都知道它的中介者对象。
 — 每一个同事对象在需与其他的同事通信的时候,与它的中介者通信。
 */
public class ColleagueA extends Colleague {
    public ColleagueA(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 得到中介者的消息
     * @param message
     */
    public void getMessage(String message){
        System.out.println("同事-"+name+"收到消息:"+message);
    }

    /**
     * 通过中介者发布消息
     * @param message
     */
    public void contact(String message){
        mediator.contact(message,this);
    }
}
public class MediatorTest {

    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        Colleague colleaguea = new ColleagueA("A",mediator);
        Colleague colleagueb = new ColleagueA("B",mediator);
        Colleague colleaguec = new ColleagueA("C",mediator);
        mediator.addColleague(colleaguea);
        mediator.addColleague(colleagueb);
        mediator.addColleague(colleaguec);

        colleaguea.contact("吃饭了");
        colleagueb.contact("今天吃什么?");
        colleaguec.contact("肯德基吧.");
        colleaguea.contact("好啊.");
        colleagueb.contact("行");
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值