中介者模式-协调多个对象之间的交互

这篇具有很好参考价值的文章主要介绍了中介者模式-协调多个对象之间的交互。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 在深圳租房市场,有着许多的“二房东”,房主委托他们将房子租出去,而租客想要租房的话,也是和“二房东”沟通,租房期间有任何问题,找二房东解决。对于房主来说,委托给“二房东”可太省事了,只要签个委托协议,然后坐等收钱就可以了,可以不要跟租客打交道。 而对于租客来说,租房期间的任何问题,找“二房东”解决也比较方便。 当然付出的代价就是“中间商赚差价”了。这就是中介者模式。

1 中介者模式概述

如果一个系统中对象之间的联系呈现为网状结构,对象之间存在大量的多对多联系,将导致系统非常复杂。它们之间通过彼此相互作用实现系统的行为。这将导致系统过度耦合。

中介者模式-协调多个对象之间的交互,设计模式的艺术,中介者模式,设计模式,java

图 对象之间存在复杂关系的网状结构

通过引人中介者对象,可以将系统的网状结构变成以中介者为中心的星形结构。在这个星形结构中,同事对象不再之间与另一个对象联系,它通过中介者对象与另一个对象发生相互作用。

中介者模式-协调多个对象之间的交互,设计模式的艺术,中介者模式,设计模式,java

图 引入中介者对象的星形结构

中介者模式可以使对象之间的关系数量急剧减少。保证了对象结构上的稳定,系统的结构不会因为新对象的引入带来大量的修改工作。

1.1 模式定义

如果在一个系统中对象之间存在多对多的相互关系,可以将对象之间的一些交互行为从各个对象中分离出来,并集中封装在一个中介者对象中,由该中介者进行统一协调。

这样对象之间多对多的复杂关系就转化为相对简单的一对多关系。中介者模式是迪米特法则的一个典型应用。

中介者模式-协调多个对象之间的交互,设计模式的艺术,中介者模式,设计模式,java

图 中介者模式结构图

Mediator:抽象中介者,定义一个接口,用于与各同事对象之间进行通信。

ConcreteMediator: 具体中介者,通过协调各个同事对象来实现协作行为,维持了对各个同事对象的引用。

Colleague:抽象同事类,定义各个同事类公有的方法,并声明了一些抽象方法供子类实现,同时维持了一个对抽象中介者类的引用。

ConcreteColleague:具体同事类,当每个同事对象在需要和其他同事对象通信时,先于中介者通信,通过中介者来间接完成与其他同事类的通信。

public abstract class Colleague {

    protected final String name;

    protected Mediator mediator;

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

    /**
     * 租房
     */
    public abstract void renting(String position, double price, double area);

}


public class Landlord extends Colleague{

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

    // 发布房源信息
    @Override
    public void renting(String position, double price, double area) {
        mediator.publish(this,position,price,area);
    }

    @Override
    public String toString() {
        return "房东:" + name;
    }
}

public class Tenant extends Colleague{

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

    // 求租
    @Override
    public void renting(String position, double price, double area) {
        mediator.renting(this,position,price,area);
    }

    @Override
    public String toString() {
        return "租客:" + name;
    }
}

public interface Mediator {

    /**
     * 租房
     *
     * @param position
     *          位置
     * @param price
     *          价格
     * @param area
     *          面积
     */
    void renting(Tenant tenant,String position, double price, double area);

    /**
     * 发布房源信息
     *
     */
    void publish(Landlord landlord,String position, double price, double area);

}

public class ConcreteMediator implements Mediator{

    /**
     * 房东集合
     */
    private final Set<Landlord> landlords = new HashSet<>();

    /**
     * 租户集合
     */
    private final Set<Tenant> tenants = new HashSet<>();

    /**
     * 房源信息集合
     */
    private final List<RoomInfo> roomInfos = new ArrayList<>();

    @Override
    public void renting(Tenant tenant, String position, double price, double area) {
        System.out.print("【" + position + ",价格:" + price + "以下,面积" + area + "】");
        tenants.add(tenant);
        for (RoomInfo item : roomInfos) {
            if (item.getTenant() == null) {
                if (item.getPosition().equals(position) && item.getPrice() <= price && item.getArea() >= area) {
                    item.setTenant(tenant);
                    System.out.println("租房成功:" + item);
                    return;
                }
            }
        }
        System.out.println("没有找到合适的房源");

//        运行结果:
//        【罗湖区,价格:1800.0以下,面积25.0】没有找到合适的房源
//        【福田区,价格:3000.0以下,面积25.0】租房成功:RoomInfo(price=28.0, area=2800.0, position=福田区, tenant=租客:李四, landlord=房东:老张)
    }

    @Override
    public void publish(Landlord landlord, String position, double price, double area) {
        landlords.add(landlord);
        RoomInfo roomInfo = new RoomInfo();
        roomInfo.setLandlord(landlord);
        roomInfo.setPosition(position);
        roomInfo.setPrice(price);
        roomInfo.setArea(area);
        roomInfos.add(roomInfo);
    }

}

@Data
public class RoomInfo {

    private double price;

    private double area;

    private String position;

    private Tenant tenant;

    private Landlord landlord;

}

public class Client {

    public static void main(String[] args) {
        Mediator mediator = new ConcreteMediator();

        Landlord landlord1 = new Landlord("老张",mediator);
        landlord1.renting("福田区",28,2800);
        landlord1.renting("福田区",20,2200);
        landlord1.renting("福田区", 7, 1500);

        Landlord landlord2 = new Landlord("老黄", mediator);
        landlord2.renting("龙岗区", 3400,70);
        landlord2.renting("龙岗区", 2800,50);

        Tenant tenant1 = new Tenant("张三",mediator);
        tenant1.renting("罗湖区", 1800, 25);
        Tenant tenant2 = new Tenant("李四",mediator);
        tenant2.renting("福田区", 3000, 25);

    }

}

1.2 中介者类的作用

1)中转作用(结构性)。通过中介者提供的中转作用,各个同事对象就不再需要显式地引用其他同事。当需要和其他同事进行通信时,可通过中介者来实现间接调用。

2)协调作用(行为性)。中介者可进一步对同事之间的关系进行封装,同事可以一致地和中介者进行交互,而不需要指明中介者需要具体怎么做。中介者根据封装在自身内部的协调逻辑,对同事的请求进行进一步处理。将同事成员之间的关系行为进行分离和封装。

2 优缺点

优点:

  1. 简化对象间交互;
  2. 将各同事对象解耦,可以独立改变和复用每一个同事和中介者,增加新的中介者和同事类比较方便。

缺点:文章来源地址https://www.toymoban.com/news/detail-668645.html

  1. 中介者类包含大量同事之间的交互细节,会使得具体中介者类非常复杂。

3 适用场景

  1. 对象之间存在复杂的引用关系,系统结构混乱且难以理解。
  2. 想通过一个中间类来封装多个类中的行为,而又不想生成太多的子类。

到了这里,关于中介者模式-协调多个对象之间的交互的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 简化对象间交互:Java中介者模式实践

    中介者模式 (Mediator Pattern) 是一种在软件设计中用来降低多个对象或组件间的耦合度的设计模式,它属于行为型设计模式。在 Java 中,中介者模式的核心思想是定义一个中介对象,让原本相互依赖的对象之间通过中介者进行通信,而不是直接相互引用。这样可以使各个对象之

    2024年04月10日
    浏览(37)
  • 设计模式-中介者模式

    本文将详细介绍设计模式中的中介者模式,其中包括,中介者模式的优点、缺点、各组成部分。 中介者模式(Mediator Pattern)是一种设计模式,它定义了一个中介者类,该类将多个对象之间的通信抽象化,使得这些对象可以通过中介者进行通信,从而降低它们之间的直接耦合

    2024年02月09日
    浏览(36)
  • 设计模式——中介者模式

    中介者模式(Mediator Pattern)是一种行为型设计模式,它旨在减少多个对象之间的相互引用和耦合度。通过引入一个中介对象来封装一系列交互行为,使得原本复杂的网状关系结构转变为星形结构,所有对象与中介者通信而不是彼此直接通信。 抽象中介者(Mediator Interface):

    2024年01月18日
    浏览(39)
  • 行为型模式--中介者模式

    目录 概述 结构 案例实现 优缺点 优点: 缺点: 使用场景 一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复 杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同 事类对象,

    2024年02月10日
    浏览(37)
  • 行为型模式-中介者模式

    概述 一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即不利于类的复用,也不稳定。例如在下左图中,有六个同事类对象,假如对象1发生变化,那么将会有4个对象受到影响。如

    2024年02月02日
    浏览(32)
  • 【行为型模式】中介者模式

    一、中介者模式概述          中介者模式定义 : 用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。中介者模式又称为调停者模式。( 对象行为型模式 ) 中介者模式的优缺点 : 优

    2024年04月26日
    浏览(34)
  • 设计模式篇---中介者模式

    中介者模式:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显示地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。 就好比世界各个国家之间可能会产生冲突,但是当产生冲突的时候需要联合国来解决冲突。每个国家之间的关系,就好

    2024年01月22日
    浏览(39)
  • 设计模式之中介者模式

    详细介绍         中介者模式(Mediator Pattern)是一种行为设计模式, 它通过定义一个中介类来封装多个对象之间的交互,使各对象不需要显示地相互引用,从而降低耦合度,提高系统的可维护性和灵活性。中介者模式将原本一对多的网状关系转变为一对多的关系,即每个

    2024年04月29日
    浏览(68)
  • Java中介者模式

    目录 定义 结构 案例 优点 缺点 使用场景 又叫调停模式,定义一个中介角色来封装一系列对象之间的交互,使原有对象之间的耦合松散,且可以独立地改变它们之间的交互。 中介者模式包含以下主要角色: 抽象中介者角色:它是中介者的接口,提供了同事对象注册与转发同

    2024年02月04日
    浏览(36)
  • 设计模式(十七)中介者

    义一个对象来封装一系列的对象交互。中介者模式使各对象不需要显示地相互引用,从而使其耦合松散,而且可以让你相对独立地改变它们之间的交互。中介者模式又称为调停模式,它是一种对象说行为型模式。 在中介者模式中,引入了用于协调其他对象/类之间的相互调用

    2024年02月04日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包