欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

21、中介者模式—打破一系列对象之间直接通信的耦合性

程序员文章站 2024-03-23 08:35:28
...

中介者模式(Mediator):用一个中介对象来封装一系列对象交互。中介者使各对象不需要显示地互相引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。

UML图:

21、中介者模式—打破一系列对象之间直接通信的耦合性

package com.thpin.repository.designpattern;

public class MediatorDemo {
    public static void main(String[] args) {
        ConcreteMediator mediator = new ConcreteMediator();
        ConcreteColleague1 colleague1 = new ConcreteColleague1(mediator);
        ConcreteColleague2 colleague2 = new ConcreteColleague2(mediator);
        mediator.setColleague1(colleague1);
        mediator.setColleague2(colleague2);
        colleague1.send("你要听话,早点睡觉");
        colleague2.send("但是我想你,想的睡不着觉了");
    }
}

/*
 * 中介者
 */
abstract class Mediator {
    public abstract void send(String message, Colleague colleague);
}

/*
 * 同事接口
 */
abstract class Colleague {
    protected Mediator mediator;

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

/*
 * 中介者实现类
 */
class ConcreteMediator extends Mediator {
    private ConcreteColleague1 colleague1;
    private ConcreteColleague2 colleague2;
    public void setColleague1(ConcreteColleague1 colleague1) {
        this.colleague1 = colleague1;
    }
    public void setColleague2(ConcreteColleague2 colleague2) {
        this.colleague2 = colleague2;
    }
    public void send(String message, Colleague colleague) {
        if (colleague == colleague1) {
            colleague2.notify(message);
        } else {
            colleague1.notify(message);
        }
    }
}

/*
 * 同事1
 */
class ConcreteColleague1 extends Colleague {

    public ConcreteColleague1(Mediator mediator) {
        super(mediator);
    }
    
    public void send(String message) {
        mediator.send(message, this);
    }
    
    public void notify(String message) {
        System.out.println("ConcreteColleague1 得到信息:" + message);
    }
}

/*
 * 同事2
 */
class ConcreteColleague2 extends Colleague {

    public ConcreteColleague2(Mediator mediator) {
        super(mediator);
    }
    
    public void send(String message) {
        mediator.send(message, this);
    }
    
    public void notify(String message) {
        System.out.println("ConcreteColleague2 得到信息:" + message);
    }
}

结果:

ConcreteColleague2 得到信息:你要听话,早点睡觉

ConcreteColleague1 得到信息:但是我想你,想的睡不着觉了

中介者模式在系统中很容易在系统中使用,也很容易在系统中吴用。当系统中出现了“多对多”交互复杂的对象群时,不要急于使用中介者模式,而要反思你的系统在设计上是不是合理。

Mediator的出现减少了各个Colleaguezh之间的耦合,使得可以独立地改变和复用各个Colleague类和Mediator。由于把对象如何协作进行了抽象,将中介作为一个独立的概念并将其封装在一个对象中,这样关注的对象就从对象各自本身的行为转移到他们之间的交互上来,也就是站在一个宏观的角度去看待系统。但是由于ConcreteMediator控制了集中化,于是把交互复杂性变为了中介者的复杂性,这就使得中介者变得比任何一个ConcreteColleague都复杂。中介者模式一般用于一组对象以定义良好但是复杂的方式进行通信的场合。以及想定制一个分布在多个类中的行为,而又不想生成太多的子类的场合。中介者模式是迪米特法则的很好体现。