行为型模式-中介者模式

suaxi
2022-09-19 / 0 评论 / 146 阅读 / 正在检测是否收录...
(1)概述

中介者模式又称调停模式,定义一个中介者角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立的改变它们之间的交互

(2)结构
  • 抽象中介者:它是中介者的接口,提供了同事对象注册与转发同事对象信息的抽象方法
  • 具体中介者:实现中介者接口,定义一个 List 来管理同事对象,协调各个同事对象之间的交互关系,须依赖于同事对象
  • 抽象同事类:定义同事类的接口,保存中介者对象,提供同事对象交互的抽象方法,实现所有相互影响的同事类的公共功能
  • 具体同事类:实现抽象同事类接口,当需要与其他同事对象交互时,由中介者对象负责后续的交互
(3)案例

以租房为例

7.中介者模式(以租房为例).png

抽象中介者

public abstract class Mediator {

    /**
     * 交流
     *
     * @param message 信息
     * @param person  抽象同事类
     */
    public abstract void contact(String message, Person person);
}

具体中介者

public 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 contact(String message, Person person) {
        if (person == houseOwner) {
            tenant.getMessage(message);
        } else {
            houseOwner.getMessage(message);
        }
    }
}

抽象同事类

public abstract class Person {

    protected String name;
    protected Mediator mediator;

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

具体同事类

public class HouseOwner extends Person {

    public HouseOwner(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 与中介沟通
     *
     * @param message 信息
     */
    public void contact(String message) {
        mediator.contact(message, this);
    }

    /**
     * 获取信息
     *
     * @param message 信息
     */
    public void getMessage(String message) {
        System.out.println("房东获取到的信息:" + message);
    }
}

public class Tenant extends Person {

    public Tenant(String name, Mediator mediator) {
        super(name, mediator);
    }

    /**
     * 与中介沟通
     *
     * @param message 信息
     */
    public void contact(String message) {
        mediator.contact(message, this);
    }

    /**
     * 获取信息
     *
     * @param message 信息
     */
    public void getMessage(String message) {
        System.out.println("租房者获取到的信息:" + message);
    }
}

Client

public class Client {
    public static void main(String[] args) {
        //创建中介者
        MediatorStructure mediatorStructure = new MediatorStructure();

        //租房者
        Tenant tenant = new Tenant("孙笑川", mediatorStructure);

        //房东
        HouseOwner houseOwner = new HouseOwner("刘波", mediatorStructure);

        //中介需知道具体的租房者和房东
        mediatorStructure.setTenant(tenant);
        mediatorStructure.setHouseOwner(houseOwner);

        tenant.contact("我要租房");
        houseOwner.contact("我这里有");
    }
}
(4)优缺点
  • 松散耦合:通过把多个同事对象之间的交互封装到中介者对象里面,从而使得同事对象之间松散耦合,可以做到互补依赖,同事对象也可以独立的变化和复用
  • 集中控制交互:多个同事对象的交互,被封装在中介者对象中集中管理,在交互发生变化的时候,只需修改中介者(或者进行扩展)
  • 一对多的关联转变为一对一:引入中介者之后,中介者与同事对象的关系变为双向一对一,使同事对象的关系易于理解和实现
  • 当同事类较多时,中介者的职责很重,结构复杂且难以维护
(5)使用场景
  • 系统中对象间存在复杂的引用关系,系统结构混乱且难以理解
  • 需创建一个运行于多个类之间的对象,又不想生成新的子类时
0

评论 (0)

取消