最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS設計模式之中介者模式使用方法詳解

 更新時間:2023年08月27日 09:49:45   作者:慕仲卿  
JavaScript中介者模式是一種行為型設計模式,用于降低多個對象之間的耦合性,在中介者模式中,多個對象之間不直接相互通信,而是通過中介者進行通信, 本文就來給大家詳細的介紹一下JS設計模式之中介者模式使用方法,需要的朋友可以參考下

中介者模式(Mediator Pattern)

定義:

是一種行為型設計模式,用于降低多個對象之間的耦合性。

作用:

中介者模式通過引入一個中介者對象,將對象之間的交互集中管理和控制。

特點:

在中介者模式中,多個對象之間不直接相互通信,而是通過中介者進行通信。 中介者對象封裝了對象之間的交互邏輯,各個對象只需要與中介者進行通信,而不需要了解其他對象的存在。

參與者:

  • 抽象中介者(Abstract Mediator):定義了中介者對象的接口,聲明了對象之間的通信方法。
  • 具體中介者(Concrete Mediator):實現(xiàn)了抽象中介者的接口,負責協(xié)調(diào)和控制各個對象之間的通信。
  • 抽象同事類(Colleague):每個同事類都知道它的中介者對象,并通過中介者對象來與其他同事類進行通信。
  • 具體同事類(Concrete Colleague):實現(xiàn)了同事類的接口,負責處理自己的行為,并與其他同事類通過中介者進行通信。

工作流程:

  • 定義抽象中介者接口,其中聲明了對象之間的通信方法。
  • 定義具體中介者類,實現(xiàn)抽象中介者接口,并負責協(xié)調(diào)和控制各個對象之間的通信。
  • 定義抽象同事類接口,其中聲明了與中介者進行通信的方法。
  • 定義具體同事類,實現(xiàn)同事類接口,并實現(xiàn)自己的行為邏輯。
  • 在具體同事類中,通過持有中介者對象的引用,通過中介者進行與其他同事類的通信。

優(yōu)勢:

  • 降低了對象之間的耦合性,使得對象之間的交互更加靈活和可擴展。
  • 將對象之間的交互邏輯集中管理和控制,減少了代碼的復雜性。

劣勢:

  • 中介者對象可能會變得復雜,因為它要處理多個對象之間的交互邏輯。
  • 引入中介者對象可能會導致系統(tǒng)中對象的數(shù)量增加。

舉例:

假設我們有一個簡單的聊天室應用程序,其中包含多個用戶對象和一個中介者對象來協(xié)調(diào)用戶之間的通信。每個用戶對象都可以發(fā)送消息給其他用戶,并接收其他用戶發(fā)送的消息

首先,定義抽象中介者接口:

abstract class AbstractMediator {
  // 通信用抽象方法
  abstract sendMessage(sender: Colleague, message: string): void;
}

然后,定義具體中介者類:

class ChatRoomMediator extends AbstractMediator {
  users = [];
  // 中介者收集同事類實例對象
  addUser(user: Colleague) {
    this.users.push(user);
  }
  // 實現(xiàn)通信用的抽象方法
  sendMessage(sender: Colleague, message: string) {
    for (let user of this.users) {
      user !== sender && user.receiveMessage(sender, message);
    }
  }
}

接下來,定義抽象同事類接口:

abstract class Colleague {
  constructor(public mediator: AbstractMediator) {}
  // 作為中介者模式的參與者,每一個同事類對象都具有發(fā)送信息和處理信息的方法
  // 不同之處在于發(fā)送信息方法已經(jīng)被抽象類實現(xiàn),而處理信息的方法需要根據(jù)子類的情況定制實現(xiàn)
  send(message) {
    this.mediator.sendMessage(this, message);
  }
  abstract receiveMessage(sender: Colleague, message: string): void;
}

然后,定義具體同事類:

class User extends Colleague {
  constructor(public name: string, mediator: AbstractMediator) {super(mediator)}
  receiveMessage(sender: Colleague, message: string) {
    console.log(`${this.name} received a message from ${sender.name}: ${message}`);
  }
}

最后,在客戶端代碼中創(chuàng)建中介者對象、同事對象; 使用中介者對象收集參與對話的同事對象并進行通信示例:

// 創(chuàng)建中介者對象
const chatRoomMediator = new ChatRoomMediator();
// 創(chuàng)建同事對象
// 每一個同事類對象都應該保持對中介者對象的引用
const user1 = new User('User 1', chatRoomMediator);
const user2 = new User('User 2', chatRoomMediator);
const user3 = new User('User 3', chatRoomMediator);
// 中介者對象收集同事類對象;其實這里也可以做成new User的時候自動將實例添加到中介者users數(shù)組中去,將具體同事類的構(gòu)造函數(shù)修改成:
/*
  constructor(name: string, mediator: AbstractMediator) {
    super(mediator);
    this.name = name;
    mediator.addUser(this);
  }
*/
chatRoomMediator.addUser(user1);
chatRoomMediator.addUser(user2);
chatRoomMediator.addUser(user3);
// 用戶之間通過中介者進行通信的示例
user1.send('Hello, everyone!');
user2.send('Hi, User 1!');
user3.send('Nice to meet you all!');
/*
>>>
User 2 received a message from User 1: Hello, everyone!
User 3 received a message from User 1: Hello, everyone!
User 1 received a message from User 2: Hi, User 1!
User 3 received a message from User 2: Hi, User 1!
User 1 received a message from User 3: Nice to meet you all!
User 2 received a message from User 3: Nice to meet you all!
*/

其他應用場景:

ws的客戶端和服務端

  • WebSocket(ws)的客戶端和服務端可以被視為中介者模式中的同事類(Colleague)和具體中介者類(Concrete Mediator)。
  • 在WebSocket通信中,客戶端和服務端之間通過WebSocket協(xié)議進行雙向通信。
  • 客戶端和服務端都需要連接到同一個WebSocket服務器,并通過發(fā)送和接收消息來進行通信。在這種情況下,WebSocket服務器可以充當中介者對象,負責協(xié)調(diào)和控制客戶端和服務端之間的通信。
  • 客戶端和服務端可以定義相應的發(fā)送和接收方法,通過中介者(WebSocket服務器)來進行通信。
  • 客戶端可以通過WebSocket對象的send方法向服務器發(fā)送消息,而服務器可以通過WebSocket對象的onmessage事件監(jiān)聽并處理客戶端發(fā)送的消息。

以下是一個簡單的示例代碼,演示了WebSocket客戶端和服務端之間的通信:

客戶端代碼:

const socket = new WebSocket('ws://localhost:8080');
socket.onopen = () => {
  console.log('WebSocket connection opened.');
  socket.send('Hello, server!');
};
socket.onmessage = (event) => {
  const message = event.data;
  console.log('Received message from server:', message);
};
socket.onclose = () => {
  console.log('WebSocket connection closed.');
};

服務端代碼:

const WebSocket = require('ws');
const wss = new WebSocket.Server({ port: 8080 });
wss.on('connection', (ws) => {
  console.log('WebSocket connection established.');
  ws.on('message', (message) => {
    console.log('Received message from client:', message);
    ws.send('Hello, client!');
  });
  ws.on('close', () => {
    console.log('WebSocket connection closed.');
  });
});

electron的主進程和渲染進程

  • 在 Electron 中,主進程(Main Process)和渲染進程(Renderer Process)可以被視為中介者模式中的中介類(Concrete Mediator)和同事類(Colleague)。
  • 它們之間通過 IPC(Inter-Process Communication)進行通信。
  • 主進程是 Electron 應用程序的核心,負責管理應用程序的生命周期、窗口管理和與系統(tǒng)資源的交互。
  • 渲染進程是由主進程創(chuàng)建的 Web 頁面,每個渲染進程都運行在獨立的沙箱環(huán)境中,負責顯示和交互用戶界面。
  • 主進程可以通過 ipcMain 對象監(jiān)聽和處理來自渲染進程的消息,而渲染進程可以通過 ipcRenderer 對象向主進程發(fā)送消息。

以下是一個簡單的示例代碼,演示了 Electron 主進程和渲染進程之間的通信:

主進程代碼:

const { app, BrowserWindow, ipcMain } = require('electron');
let mainWindow;
app.on('ready', () => {
  mainWindow = new BrowserWindow();
  mainWindow.loadURL('index.html');
});
ipcMain.on('messageFromRenderer', (event, message) => {
  console.log('Received message from renderer:', message);
  event.sender.send('messageToRenderer', 'Hello, renderer!');
});

渲染進程代碼(index.html):

<!DOCTYPE html>
<html>
  <body>
    <script>
      const { ipcRenderer } = require('electron');
      ipcRenderer.send('messageFromRenderer', 'Hello, main process!');
      ipcRenderer.on('messageToRenderer', (event, message) => {
        console.log('Received message from main process:', message);
      });
    </script>
  </body>
</html>

計算機主板硬件之間的關(guān)系

  • 在計算機硬件中,主板上的元件和總線可以被視為中介者模式中的同事類(Colleague)和具體中介者類(Concrete Mediator)。
  • 主板上的各個元件(如處理器、內(nèi)存、顯卡等)之間需要進行數(shù)據(jù)傳輸和協(xié)調(diào)工作。
  • 這些元件通過總線來進行通信,而總線充當了中介者的角色,負責協(xié)調(diào)和控制元件之間的通信。
  • 總線作為中介者對象,將各個元件之間的通信集中管理和控制。元件之間不直接相互通信,而是通過總線進行數(shù)據(jù)傳輸和交互。
  • 每個元件都知道總線的存在,并通過總線來發(fā)送和接收數(shù)據(jù)。

如下圖所示:

+---------------------+
|      Mainboard      |
+---------------------+
|       Processor     |
|        Memory       |
|        GPU          |
|        ...          |
+---------------------+
         |
         |   +---------+
         +---|  Bus    |
             +---------+

業(yè)務使用場景:

  • 事件中心(Event Centralization):中介者模式可以用于將多個對象的事件處理集中管理。一個中介者對象可以作為事件中心,接收來自多個對象的事件,并根據(jù)需要進行廣播或轉(zhuǎn)發(fā)。
class Mediator {
  constructor() {
    this.subscribers = [];
  }
  subscribe(subscriber) {
    this.subscribers.push(subscriber);
  }
  unsubscribe(subscriber) {
    this.subscribers = this.subscribers.filter((s) => s !== subscriber);
  }
  broadcast(event, data) {
    for (let subscriber of this.subscribers) {
      subscriber.handleEvent(event, data);
    }
  }
}
class Subscriber {
  handleEvent(event, data) {
    console.log(`Received event '${event}' with data:`, data);
  }
}
const mediator = new Mediator();
const subscriber1 = new Subscriber();
mediator.subscribe(subscriber1);
const subscriber2 = new Subscriber();
mediator.subscribe(subscriber2);
mediator.broadcast('click', { x: 100, y: 200 });
  • 表單驗證(Form Validation):中介者模式可以用于對表單中的多個字段進行聯(lián)合驗證。每個字段可以通過中介者對象注冊自己的驗證規(guī)則和錯誤處理函數(shù),中介者對象負責協(xié)調(diào)和觸發(fā)驗證邏輯
class Mediator {
  constructor() {
    this.fields = {};
  }
  registerField(field, validationRules, errorHandle) {
    this.fields[field] = { validationRules, errorHandle };
  }
  validate() {
    let isValid = true;
    for (let field in this.fields) {
      const { validationRules, errorHandle } = this.fields[field];
      const value = document.getElementById(field).value;
      for (let rule of validationRules) {
        if (!rule.test(value)) {
          errorHandle(field);
          isValid = false;
          break;
        }
      }
    }
    return isValid;
  }
}
const mediator = new Mediator();
mediator.registerField(
  'username',
  [/.{5,}/],
  (field) => console.log(`Invalid value for field '${field}'.`)
);
mediator.registerField(
  'password',
  [/.{8,}/, /[A-Z]/, /[0-9]/],
  (field) => console.log(`Invalid value for field '${field}'.`)
);
document.getElementById('submit-button').addEventListener('click', () => {
  if (mediator.validate()) {
    console.log('Form submitted successfully.');
  }
});

總結(jié):

中介者模式提供了一種可擴展和可維護的方式來處理復雜的交互關(guān)系,適用于以下情況:

  • 系統(tǒng)中多個對象之間存在復雜的交互關(guān)系,導致耦合度較高。
  • 需要將對象之間的交互邏輯集中管理和控制,避免其分散在多個對象中。

以上就是JS設計模式之中介者模式使用方法詳解的詳細內(nèi)容,更多關(guān)于JS中介者模式的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • js 數(shù)組當前行添加數(shù)據(jù)方法詳解

    js 數(shù)組當前行添加數(shù)據(jù)方法詳解

    這篇文章主要介紹了js 數(shù)組當前行添加數(shù)據(jù)方法詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • button沒寫type=button會導致點擊時提交

    button沒寫type=button會導致點擊時提交

    點擊了一個彈窗中的按鈕,想到彈窗消失了,經(jīng)測試后發(fā)現(xiàn)button 沒寫type=button會導致點擊時提交
    2014-03-03
  • JavaScript中Map和Object的區(qū)別詳解

    JavaScript中Map和Object的區(qū)別詳解

    Map 和 Object 都是 JavaScript 中用于存儲鍵值對的數(shù)據(jù)結(jié)構(gòu),這篇文章主要介紹了JavaScript中Map和Object區(qū)別的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2025-08-08
  • js鼠標滑過圖片震動特效的方法

    js鼠標滑過圖片震動特效的方法

    這篇文章主要介紹了js鼠標滑過圖片震動特效的方法,涉及onMouseOver事件及圖片操作的技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑指南

    H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑指南

    這篇文章主要給大家介紹了關(guān)于H5跳轉(zhuǎn)小程序按鈕不顯示(wx-open-launch-weapp)踩坑的相關(guān)資料,文中介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2023-02-02
  • 淺談js for循環(huán)輸出i為同一值的問題

    淺談js for循環(huán)輸出i為同一值的問題

    下面小編就為大家?guī)硪黄獪\談js for循環(huán)輸出i為同一值的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • 使用JavaScript判斷手機瀏覽器是橫屏還是豎屏問題

    使用JavaScript判斷手機瀏覽器是橫屏還是豎屏問題

    這篇文章主要介紹了使用JavaScript判斷手機瀏覽器是橫屏還是豎屏問題的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-08-08
  • JavaScript中實現(xiàn)對象復制的終極指南

    JavaScript中實現(xiàn)對象復制的終極指南

    在 JavaScript 開發(fā)中,我們經(jīng)常需要復制一個對象或數(shù)組,當我們處理像用戶列表、配置項、表單數(shù)據(jù)等復雜結(jié)構(gòu)時,淺拷貝(shallow copy)常常無法滿足需求,真正的解決方案是深拷貝,本文將從內(nèi)存原理出發(fā),深入剖析深拷貝的必要性、實現(xiàn)方式及其局限性
    2025-11-11
  • TypeScript中import?type與import的區(qū)別詳析

    TypeScript中import?type與import的區(qū)別詳析

    ES6引入了模塊化,其設計思想是在編譯時就能確定模塊的依賴關(guān)系,以及輸入和輸出的變量,下面這篇文章主要給大家介紹了關(guān)于TypeScript中import?type與import區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • 實例講解JS中setTimeout()的用法

    實例講解JS中setTimeout()的用法

    這篇文章主要介紹了JS中setTimeout()的用法,setTimeout()是屬于window的method,但我們都是略去window這頂層對象名稱,這是用來設定一個時間,時間到了,就會執(zhí)行一個指定的method,需要深入了解的朋友可以參考下
    2016-01-01

最新評論

永仁县| 湖南省| 弥勒县| 新河县| 林甸县| 潮州市| 潞西市| 高唐县| 莆田市| 电白县| 若尔盖县| 当雄县| 本溪市| 班玛县| 泽普县| 永宁县| 平遥县| 建湖县| 平乡县| 九龙城区| 德庆县| 松原市| 贵德县| 老河口市| 乌拉特中旗| 修武县| 阿图什市| 中牟县| 绥芬河市| 屯门区| 淮阳县| 七台河市| 喜德县| 富川| 海盐县| 雷州市| 白河县| 五峰| 肇东市| 武鸣县| 普定县|