Skip to content
文档章节

中介者模式

中介者模式(Mediator Pattern)

说起中介,很容易想起“房屋中介”,“租房中介”,“婚姻中介”等中介,这些中介跟我们要讲的中介是不同的,这些中介可以看做是代理人的身份,可以参考“代理模式”。

我们要说的中介者,其实是用来处理各种对象之间的关系。如果没有中介者,各个对象之间的关系是多对多网状的关系,有中介者各个 对象只需要和中介者建立联系,与其他对象之间的关系操作则是由中介者代劳,各个 对象之间不需要知道对方的存在。

举个例子:

中介者模式:假设 B 有件东西正在对外售卖,价高者得,购买者有 A1,A2,A3,A4,A5, 各自出价给中介者 C, 中介者 C 计算出最高出价,然后通知其他购买者,是否有加价的,最终确定由谁胜出购买。这是中介者。

代理模式: A 要购买 B 的东西,但是 A 跟 B 不熟,所以通过中间人 C 来向 A 出价,A 也授权 C 来对接售卖事宜,同时 C 也能直接拒绝购买力差,没有信用的买家。

js
// 中介者
const mediator = (function () {
  const buyers = [];
  let highestBuyer = null;

  let timer;

  // 注册购买者
  function registerBuyer(buyer) {
    if (buyers.indexOf(buyer) === -1) {
      buyers.push(buyer);
    }
  }

  // 接收购买者出价
  function receiveBid(buyer) {
    if (!highestBuyer || (buyer !== highestBuyer && buyer.price > highestBuyer.price)) {
      highestBuyer = buyer;

      console.log(`当前最高价 ${highestBuyer.name} 出价 ${highestBuyer.price}`);

      // 通知所有购买者最高出出价
      noticeBuyers(highestBuyer);

      if (timer) {
        clearTimeout(timer);
      }

      // 20s内没有更高出价,则当前出价最高者获得购买资格
      timer = setTimeout(() => {
        console.log(`恭喜 ${highestBuyer.name} 出价 ${highestBuyer.price} 获得购买资格`);
      }, 10 * 1000);
    }
  }

  function noticeBuyers() {
    buyers.forEach(buyer => buyer.receiveMsg(highestBuyer));
  }

  return {
    highestBuyer,
    registerBuyer,
    receiveBid,
  };
})();

/**
 * 购买人
 * @param {string} name name
 * @param {number} money 购买人拥有钱财
 */
function Buyer(name, money) {
  this.name = name;
  this.money = money;
  this.price = 0;

  // 注册购买者
  mediator.registerBuyer(this);
}

/**
 * 出价
 * @param {number} price 价格
 */
Buyer.prototype.bid = function (price = 0) {
  if (this.price && this.price > this.money) return;
  this.price = price;
  console.log(`${this.name} 出价 ${this.price}`);
  mediator.receiveBid(this);
};

/**
 * 购买人收到消息谁是最高出价人以及最高出价,决定是否再次出价
 * @param {Buyer} highestBuyer 出价最高者
 */
Buyer.prototype.receiveMsg = function (highestBuyer) {
  if (this !== highestBuyer && this.money > highestBuyer.price) {
    // 根据自己能力决定是否再次出价
    // if (Math.random() > 0.5) {
    let delay = Math.floor(Math.random() * 10);
    const self = this;

    setTimeout(() => {
      self.bid(highestBuyer.price + 100);
    }, delay * 1000);
  }
  // }
};

var buyer1 = new Buyer('name1', 1000);
var buyer1 = new Buyer('name2', 1600);
var buyer1 = new Buyer('name3', 2000);
var buyer1 = new Buyer('name4', 1300);
var buyer1 = new Buyer('name5', 1800);

buyer1.bid(1000);

参考

  1. JavaScript 设计模式与开发实践