中介者模式在React中的应用

在我们生活的世界中,每个人每个物体之间都会产生一些错综复杂的联系。在应用程序里也更是一样,程序由大大小小的单一对象组成,所有这些对象都按照某种关系和规则来通信。

什么是中介者模式

中介者模式是一种行为设计模式,它允许我们定义一个对象(中介者),它封装了一组对象如何交互的方式。这种模式被认为是一种对象行为模式,因为它可以改变程序运行时的行为。

在中介者模式中,对象之间不直接通信,而是通过中介者对象进行通信。这减少了通信对象之间的依赖关系,从而降低了系统的耦合度。当多个对象相互作用以产生工作效果,并且每个对象都知道其他对象的时候,它会导致系统变得复杂,而这种复杂性通常表现为很难管理和维护的网络式通信。

没有中介者模式

在一个没有中介者的农贸市场中,顾客和卖家之间的互动是直接的。顾客需要亲自走访各个摊位,询问关于产品的种种信息,如产地、生产方式,甚至是个别食材的烹饪建议。这种直接沟通有助于建立信任和个人联系,可能导致顾客成为常客。同时,买卖双方在交易中也会直接协商价格和交易条款,没有第三方介入,可能为顾客带来更好的价格,而卖家也可能因此获得更高的利润。

然而,这种方式也有其缺点。顾客可能会感到决策疲劳,因为他们需要在多个选项中做出选择,并且在没有统一的评价体系或价格标准的情况下,评估和比较各种产品可能会更加困难。同时,每次交易都可能需要花费更多的时间和精力,这在忙碌的日常生活中可能不太理想。尽管如此,直接的买卖方式提供了一种更个性化且有趣的购物体验,这在现代商业中依然保有其独特的吸引力。

中介者模式在生活中的案例

在现实生活中,房地产经纪人就是一个中介者模式的实例。当人们想要买卖房产时,他们通常会雇佣一个房地产经纪人来协助这一过程。

房地产经纪人作为买家和卖家之间的中介者,负责协调所有与房产交易相关的活动。他们了解市场情况,可以为卖家定价房产,为买家寻找合适的房源,还可以组织和安排房屋展示。当买家对某个房产感兴趣时,他们会通过经纪人向卖家提交报价,经纪人还会帮助双方协商价格和销售条件。

此外,房地产经纪人还会帮助客户处理繁杂的文件工作,确保所有必要的法律文件都得到妥善处理,交易能够顺利完成。在整个买卖过程中,经纪人都会作为中心节点,确保信息准确传递,并协助解决可能出现的任何问题。

通过使用房地产经纪人,买家和卖家不需要直接交流,这样可以节省时间,减少误解,并有助于顺利达成交易。这就是中介者模式在现实生活中的一个典型案例。

中介者模式在 Js 中的应用

假设我们有一个在线拍卖系统,该系统允许用户出价并在拍卖结束时通知所有用户最终结果。这里的中介者可以是拍卖控制器,负责管理出价和通知用户。

在线拍卖平台,有以下参与者:

  • 拍卖控制器(中介者):管理拍卖过程,记录出价,通知用户。
  • 拍卖者:参与拍卖,出价。
  • 拍卖结束时的通知系统:通知每个参与者拍卖的结果。

具体信息请看以下代码所示:

js 复制代码
// 中介者
class AuctionMediator {
  constructor() {
    this.buyers = {};
    this.currentBid = 0;
    this.currentWinner = null;
  }

  registerBuyer(buyer) {
    this.buyers[buyer.name] = buyer;
    buyer.setMediator(this);
    console.log(`${buyer.name} 已经注册参加拍卖。`);
  }

  bid(buyerName, amount) {
    if (amount > this.currentBid) {
      this.currentBid = amount;
      this.currentWinner = buyerName;
      console.log(`新出价 ${amount} 元,出价者为 ${buyerName}`);
    } else {
      console.log(
        `出价者 ${buyerName} 的出价 ${amount} 元被忽略,因为当前最高出价为 ${this.currentBid} 元。`
      );
    }
  }

  announceWinner() {
    Object.values(this.buyers).forEach((buyer) =>
      buyer.notify(this.currentWinner, this.currentBid)
    );
  }
}

// 拍卖者
class Buyer {
  constructor(name) {
    this.name = name;
    this.mediator = null;
  }

  setMediator(mediator) {
    this.mediator = mediator;
  }

  makeBid(amount) {
    this.mediator.bid(this.name, amount);
  }

  notify(winnerName, bidAmount) {
    if (winnerName === this.name) {
      console.log(`${this.name},恭喜你以 ${bidAmount} 元的出价赢得了拍卖!`);
    } else {
      console.log(
        `${this.name},你未能赢得拍卖。商品被 ${winnerName} 以 ${bidAmount} 元的出价购得。`
      );
    }
  }
}

// 使用中介者模式
const auction = new AuctionMediator();
const bob = new Buyer("Bob");
const alice = new Buyer("Alice");
const carol = new Buyer("Carol");

auction.registerBuyer(bob);
auction.registerBuyer(alice);
auction.registerBuyer(carol);

bob.makeBid(50);
alice.makeBid(75);
carol.makeBid(70); // 这个出价会被忽略,因为比当前最高出价低
alice.makeBid(85);

// 拍卖结束,宣布胜出者
auction.announceWinner();

在上述代码中:

  • AuctionMediator 类扮演中介者角色,管理出价并在拍卖结束时通知用户。
  • Buyer 类扮演同事的角色,可以出价并接收拍卖结果的通知。
  • registerBuyer 方法用于将买家注册到拍卖中。
  • bid 方法允许买家通过中介者出价。
  • announceWinner 方法由中介者调用来通知所有买家拍卖结果。

通过这种方式,买家不需要直接相互通信,而是通过拍卖控制器(中介者)来协调整个过程。这样做可以轻松地添加新的买家或更改通知逻辑,而不会影响到买家类的实现。

中介者模式在 React 中的应用

在 React 中,中介者模式通常表现为状态管理的模式,其中一个中央状态(通常是上层组件的状态或使用如 Redux、Context API 等全局状态管理库)扮演中介者的角色,管理子组件之间的交流。

下面的代码是一个简单的例子,展示了如何在 React 中实现一个聊天应用,其中一个父组件作为中介者,协调不同子组件之间的消息传递。如下代码所示:

jsx 复制代码
import React, { useState } from "react";

// 聊天记录组件
const ChatLog = ({ messages }) => {
  return (
    <ul>
      {messages.map((msg, index) => (
        <li key={index}>{msg}</li>
      ))}
    </ul>
  );
};

// 发送消息组件
const SendMessage = ({ onSend }) => {
  const [message, setMessage] = useState("");

  const send = () => {
    onSend(message);
    setMessage("");
  };

  return (
    <div>
      <input
        type="text"
        value={message}
        onChange={(e) => setMessage(e.target.value)}
      />
      <button onClick={send}>发送</button>
    </div>
  );
};

// 中介者组件
const ChatRoom = () => {
  const [messages, setMessages] = useState([]);

  const handleSend = (message) => {
    setMessages([...messages, message]);
  };

  return (
    <div>
      <ChatLog messages={messages} />
      <SendMessage onSend={handleSend} />
    </div>
  );
};

export default ChatRoom;

在上面的这些代码中:

  • ChatRoom 组件扮演中介者的角色,管理聊天消息的状态。
  • ChatLog 组件负责显示聊天记录,它接收 messages 作为 props。
  • SendMessage 组件允许用户输入消息并发送,它通过 onSend 回调函数将消息传递给 ChatRoom。

这种模式使得消息的传递和状态的更新都通过 ChatRoom 组件进行协调,这减少了子组件之间的直接通信,降低了组件间的耦合度。在更复杂的应用中,可以使用 Context API 或 Redux 等工具来实现中介者模式,以管理跨多个组件的状态。

总结

中介者模式是一个设计模式,它通过引入一个中间的协调者对象来简化多个对象或类之间的交互。这种模式减少了系统中不同组件之间的直接通信,从而降低了耦合度。在实际应用中,这有助于更容易地维护和扩展系统。但是,如果中介者承担过多职责,它可能会变得复杂,成为维护的难点。在 JavaScript 和 React 等前端技术中,中介者模式常用于状态管理和组件间通信。

相关推荐
蒜蓉大猩猩9 分钟前
Vue.js - 组件化编程
开发语言·前端·javascript·vue.js·前端框架·ecmascript
Clockwiseee28 分钟前
JS原型、原型链以及原型链污染学习
javascript·学习·原型模式
岳轩子34 分钟前
23种设计模式之原型模式
设计模式·原型模式
王解39 分钟前
一篇文章读懂 Prettier CLI 命令:从基础到进阶 (3)
前端·perttier
乐闻x1 小时前
最佳实践:如何在 Vue.js 项目中使用 Jest 进行单元测试
前端·vue.js·单元测试
遇到困难睡大觉哈哈1 小时前
JavaScript面向对象
开发语言·javascript·ecmascript
十五年专注C++开发1 小时前
C++中的链式操作原理与应用(一)
开发语言·c++·设计模式
檀越剑指大厂1 小时前
【Python系列】异步 Web 服务器
服务器·前端·python
我是Superman丶1 小时前
【前端】js vue 屏蔽BackSpace键删除键导致页面后退的方法
开发语言·前端·javascript
Hello Dam1 小时前
基于 Spring Boot 实现图片的服务器本地存储及前端回显
服务器·前端·spring boot