定义:用一个【中介者对象】封装一系列的【对象交互】,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互。

中介者模式的结构
  • 抽象中介者Mediator:定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法
  • 具体中介者ConcreteMediator:实现抽象中介者中定义的方法,它需要了解并为维护每个同事对象,并负责具体的协调各个同事对象的交互关系
  • 同事类Colleague:如果一个对象会影响其他的对象,同时也会被其他对象影响,那么这两个对象称为同事类;在实际应用中,同事类可能由多个组成,他们之间相互影响,相互依赖;同事类也可以表现为继承了同一个抽象类的一组实现组成;在中介者模式中,同事类之间必须通过中介者才能进行消息传递。
  • 具体同事类ConcreteColleague:实现自己的业务,需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互。

中介者模式的优点
  • 适当地使用中介者模式可以避免同事类之间的过度耦合,使得各同事类之间可以相对独立地使用
  • 降低了系统对象之间的耦合性,使得对象易于独立的被复用
  • 提高系统的灵活性,使得系统易于扩展和维护
  • 使用中介者模式可以将对象间一对多的关联转变为一对一的关联,使对象间的关系易于理解和维护
  • 使用中介者模式可以将对象的行为和协作进行抽象,能够比较灵活的处理对象间的相互作用
适用场景
  • 在面向对象编程中,一个类必然会与其他的类发生依赖关系,完全独立的类是没有意义的。一个类同时依赖多个类的情况也相当普遍,既然存在这样的情况,说明,一对多的依赖关系有它的合理性,适当的使用中介者模式可以使原本凌乱的对象关系清晰,但是如果滥用,则可能会带来反的效果。
  • 一般来说,只有对于那种同事类之间是网状结构的关系,才会考虑使用中介者模式。
  • 使用中介者模式,可以将网状结构变为星状结构(星状结构的中心当然是中介者啦),使同事类之间的关系变的清晰一些。
  • 中介者模式是一种比较常用的模式,也是一种比较容易被滥用的模式。对于大多数的情况,同事类之间的关系不会复杂到混乱不堪的网状结构,因此,大多数情况下,将对象间的依赖关系封装的同事类内部就可以的,没有必要非引入中介者模式。滥用中介者模式,只会让事情变的更复杂。

通过使用一个中间对象来进行消息分发以及减少类之间的直接依赖。
java.util.Timer
java.util.concurrent.Executor#execute()
java.util.concurrent.ExecutorService#submit()
java.lang.reflect.Method#invoke()

/**抽象同事类Colleague,同事类之间必须通过中介者才能进行消息传递*/
public abstract class Colleage {
    protected String name;
    protected Mediator mediator;
    Colleage(String name, Mediator mediator) {
        this.name = name;
        this.mediator = mediator;
    }
    /**与中介者联系*/
    public abstract void constact(String message);
    /**获取信息 */
    public abstract void getMessage(String message);
}
//房东,具体同事类******************************************************************************************
class HouseOwner extends Colleage {
    HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }
    @Override
    public void constact(String message) {
        mediator.constact(message, this);//需要与其他同事对象交互时,就通知中介对象,中介对象会负责后续的交互
    }
    @Override
    public void getMessage(String message) {
        System.out.println("房主" + name + "收到中介发的消息:\n        " + message);
    }
}
//房客******************************************************************************************
class Tenant extends Colleage {
    Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }
    /**与中介者联系*/
    @Override
    public void constact(String message) {
        mediator.constact(message, this);
    }
    /**获取信息*/
    @Override
    public void getMessage(String message) {
        System.out.println("租房者" + name + "收到中介发的消息:\n        " + message);
    }
}

/**抽象中介者,定义好【同事类对象】到【中介者对象】的接口,用于各个【同事类之间】的通信。在里面定义了各个同事之间相互交互所需要的方法 */
public abstract class Mediator {
    /**申明一个房东和租客之间联络的方法*/
    public abstract void constact(String message, Colleage colleage);
}
/**具体中介者,实现抽象中介者中定义的方法,它需要维护每个同事对象,并负责具体的协调各个同事对象的交互关系*/
class MediatorStructure extends Mediator {
    private HouseOwner houseOwner; //中介者必须知道房主和租房者的信息
    private Tenant tenant;
    public HouseOwner getHouseOwner() {
        return houseOwner;
    }
    public void setHouseOwner(HouseOwner houseOwner) {
        this.houseOwner = houseOwner;
    }
    public Tenant getTenant() {
        return tenant;
    }
    public void setTenant(Tenant tenant) {
        this.tenant = tenant;
    }
    @Override
    public void constact(String message, Colleage colleage) {
        if (colleage == houseOwner) tenant.getMessage("你好,我是中介,我收到房东" + tenant.name + "的出租消息,内容为【" + message + "】");
        else houseOwner.getMessage("你好,我是中介,我收到房客" + colleage.name + "的求租消息,内容为【" + message + "】");
    }
}

public class Test {
    public static void main(String[] args) {
        //一个房主、一个租房者、一个中介机构
        MediatorStructure mediator = new MediatorStructure();
        //房主和租房者只需要知道中介机构即可
        HouseOwner houseOwner = new HouseOwner("煞笔", mediator);
        Tenant tenant = new Tenant("包青天", mediator);
        //中介结构要知道房主和租房者
        mediator.setHouseOwner(houseOwner);
        mediator.setTenant(tenant);
        tenant.constact("黑中介你好,请问你那里有没有二室一厅的房要出租?");
        houseOwner.constact("有的,房租只要8000一月,很便宜吧!");
        tenant.constact("滚粗");
        houseOwner.constact("呵呵,还有一间一室一厅的房子,只要200块,要租不?");
        tenant.constact("滚蛋");
    }
}
Mediator 中介者 协调者模式-LMLPHP

附件列表

05-11 11:21