亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

中介者模式

中介者模式

解除对象与对象之间的紧耦合关系,就叫做中介者模式。

使用场景

比如我们要做一个购买手机的页面,正常的购买流程是:选择了储存容量和套餐类型之后,才会展示手机价格。

例子:

<label>储存容量:</label>
<select id="setStorage">
  <option value="-">——</option>
  <option value="8+128">8+128G</option>
  <option value="8+256">8+256G</option>
</select>
<br />
<label>套餐类型:</label>
<select id="setMeal">
  <option value="-">——</option>
  <option value="normal">官方标配</option>
  <option value="one">套餐一</option>
</select>
<br />
<br />
<span style="color: red;"></span>
<p>价格:<strong></strong></p>

<script>
  /**
    * 8+128G 官方标配 2999
    * 8+128G 套餐一 3199
    * 8+256G 官方标配 3999
    * 8+256G 套餐一 4199
    */
  const telephones = [
    { storageType: '8+128', mealType: 'normal', price: '2999' },
    { storageType: '8+128', mealType: 'one', price: '3199' },
    { storageType: '8+256', mealType: 'normal', price: '3999' },
    { storageType: '8+256', mealType: 'one', price: '4199' },
  ];

  const storage = document.querySelector('#setStorage');
  const meal = document.querySelector('#setMeal');
  const message = document.querySelector('span');
  const price = document.querySelector('strong');

  // 监听‘储存容量’事件处理程序
  storage.addEventListener('change', () => {
    const storageValue = storage.value;
    const mealValue = meal.value;

    if (storageValue === '-') {
      message.innerHTML = '请选择储存容量!';
      price.innerHTML = '';
      return false;
    }

    if (mealValue === '-') {
      message.innerHTML = '请选择套餐类型!';
      price.innerHTML = '';
      return false;
    }

    const _arr = telephones
      .filter((item) => {
        return item.storageType === storageValue;
      })
      .filter((item) => {
        return item.mealType === mealValue;
      });
    message.innerHTML = '';
    price.innerHTML = _arr[0]['price'];
  });

  // 监听‘套餐类型’事件处理程序
  meal.addEventListener('change', () => {
    const storageValue = storage.value;
    const mealValue = meal.value;

    if (storageValue === '-') {
      message.innerHTML = '请选择储存容量!';
      price.innerHTML = '';
      return false;
    }

    if (mealValue === '-') {
      message.innerHTML = '请选择套餐类型!';
      price.innerHTML = '';
      return false;
    }

    const _arr = telephones
      .filter((item) => {
        return item.storageType === storageValue;
      })
      .filter((item) => {
        return item.mealType === mealValue;
      });
    message.innerHTML = '';
    price.innerHTML = _arr[0]['price'];
  });
</script>

上面的例子中,尽管我们实现了功能,但是两个下拉框的联系很密切,试想,如果此时又增加了一个下拉框,代表手机的颜色,那么原有的两个事件处理程序,都要面临修改。
此时,就比较适合引入中介者模式,让两个下拉框解耦,而它们的依赖关系交由中介者去维护。

例子:

<label>储存容量:</label>
<select id="setStorage">
  <option value="-">——</option>
  <option value="8+128">8+128G</option>
  <option value="8+256">8+256G</option>
</select>
<br />
<label>套餐类型:</label>
<select id="setMeal">
  <option value="-">——</option>
  <option value="normal">官方标配</option>
  <option value="one">套餐一</option>
</select>
<br />
<br />
<span style="color: red;"></span>
<p>价格:<strong></strong></p>

<script>
  /**
    * 8+128G 官方标配 2999
    * 8+128G 套餐一 3199
    * 8+256G 官方标配 3999
    * 8+256G 套餐一 4199
    */
  const telephones = [
    { storageType: '8+128', mealType: 'normal', price: '2999' },
    { storageType: '8+128', mealType: 'one', price: '3199' },
    { storageType: '8+256', mealType: 'normal', price: '3999' },
    { storageType: '8+256', mealType: 'one', price: '4199' },
  ];

  const storage = document.querySelector('#setStorage');
  const meal = document.querySelector('#setMeal');
  const message = document.querySelector('span');
  const price = document.querySelector('strong');

  const Mediator = (() => {
    const changed = () => {
      const storageValue = storage.value;
      const mealValue = meal.value;

      if (storageValue === '-') {
        message.innerHTML = '请选择储存容量!';
        price.innerHTML = '';
        return false;
      }

      if (mealValue === '-') {
        message.innerHTML = '请选择套餐类型!';
        price.innerHTML = '';
        return false;
      }

      const _arr = telephones
        .filter((item) => {
          return item.storageType === storageValue;
        })
        .filter((item) => {
          return item.mealType === mealValue;
        });
      message.innerHTML = '';
      price.innerHTML = _arr[0]['price'];
    };

    return { changed };
  })();

  // 监听‘储存容量’事件处理程序
  storage.addEventListener('change', () => {
    Mediator.changed();
  });

  // 监听‘套餐类型’事件处理程序
  meal.addEventListener('change', () => {
    Mediator.changed();
  });
</script>

重构后的代码,无论是新增下拉框还是修改下拉框,我们仅仅需要改动中介者方法里的代码即可。


如有错误,欢迎指正,本人不胜感激。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
Web前端工程師
手記
粉絲
1.4萬
獲贊與收藏
860

關注作者,訂閱最新文章

閱讀免費教程

  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消