深色模式
中介者模式
中介者模式(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);
参考
- JavaScript 设计模式与开发实践