国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript設計模式之調停者模式實例詳解

2019-11-19 14:25:21
字體:
來源:轉載
供稿:網(wǎng)友

本文實例講述了JavaScript設計模式之調停者模式。分享給大家供大家參考,具體如下:

1、定義

調停者模式包裝了一系列對象相互作用的方式,使得這些對象不必相互明顯作用。從而使他們可以松散偶合。當某些對象之間的作用發(fā)生改變時,不會立即影響其他的一些對象之間的作用。保證這些作用可以彼此獨立的變化。調停者模式將多對多的相互作用轉化為一對多的相互作用。調停者模式將對象的行為和協(xié)作抽象化,把對象在小尺度的行為上與其他對象的相互作用分開處理。

2、使用的原因

當對象之間的交互操作很多,且每個對象的行為操作都依賴彼此時,為防止在修改一個對象的行為時,同時涉及到修改很多其他對象的行為,可采用調停者模式,來解決緊耦合問題.

該模式將對象之間的多對多關系變成一對多關系,調停者對象將系統(tǒng)從網(wǎng)狀結構變成以調停者為中心的星形結構,達到降低系統(tǒng)的復雜性,提高可擴展性的作用.

調停者設計模式結構圖:

調停者模式包括以下角色:

●抽象調停者(Mediator)角色:定義出同事對象到調停者對象的接口,其中主要方法是一個(或多個)事件方法。
●具體調停者(ConcreteMediator)角色:實現(xiàn)了抽象調停者所聲明的事件方法。具體調停者知曉所有的具體同事類,并負責具體的協(xié)調各同事對象的交互關系。
●抽象同事類(Colleague)角色:定義出調停者到同事對象的接口。同事對象只知道調停者而不知道其余的同事對象。
●具體同事類(ConcreteColleague)角色:所有的具體同事類均從抽象同事類繼承而來。實現(xiàn)自己的業(yè)務,在需要與其他同事通信的時候,就與持有的調停者通信,調停者會負責與其他的同事交互。

JS實現(xiàn)代碼:

CD光驅

function CDDriver( mediator ) {  //持有一個調停者對象  this.mediator = mediator;  /**   * 獲取當前同事類對應的調停者對象   */  this.getMediator = function() {    return mediator;  } //光驅讀取出來的數(shù)據(jù) this.data = "";  /**   * 獲取光盤讀取出來的數(shù)據(jù)   */  this.getData = function() {    return this.data;  }  /**   * 讀取光盤   */  this.readCD = function(){    //逗號前是視頻顯示的數(shù)據(jù),逗號后是聲音    this.data = "西游記,老孫來也!";    //通知主板,自己的狀態(tài)發(fā)生了改變    this.getMediator().changed(this);  }}

CPU處理器

function CPU( mediator ) { //持有一個調停者對象 this.mediator = mediator; /**  * 獲取當前同事類對應的調停者對象  */ this.getMediator = function() {   return mediator; }  //分解出來的視頻數(shù)據(jù)  this.videoData = "";  //分解出來的聲音數(shù)據(jù)  this.soundData = "";  /**   * 獲取分解出來的視頻數(shù)據(jù)   */  this.getVideoData = function() {    return this.videoData;  }  /**   * 獲取分解出來的聲音數(shù)據(jù)   */  this.getSoundData = function() {    return this.soundData;  }  /**   * 處理數(shù)據(jù),把數(shù)據(jù)分成音頻和視頻的數(shù)據(jù)   */  this.executeData = function(data){    //把數(shù)據(jù)分解開,前面是視頻數(shù)據(jù),后面是音頻數(shù)據(jù)    var array = data.split(",");    this.videoData = array[0];    this.soundData = array[1];    //通知主板,CPU完成工作    this.getMediator().changed(this);  }}

顯卡

function VideoCard( mediator ) {  //持有一個調停者對象  this.mediator = mediator;  /**   * 獲取當前同事類對應的調停者對象   */  this.getMediator = function() {    return mediator;  }  /**   * 顯示視頻數(shù)據(jù)   */  this.showData = function(data){    console.log("正在播放的是:" + data);  }}

聲卡

function SoundCard( mediator ){  //持有一個調停者對象  this.mediator = mediator;  /**   * 獲取當前同事類對應的調停者對象   */  this.getMediator = function() {    return mediator;  }  /**   * 按照聲頻數(shù)據(jù)發(fā)出聲音   */  this.soundData = function(data){    console.log("輸出音頻:" + data);  }}

具體調停者類

function MainBoard() {  //需要知道要交互的同事類――光驅類  this.cdDriver = null;  //需要知道要交互的同事類――CPU類  this.cpu = null;  //需要知道要交互的同事類――顯卡類  this.videoCard = null;  //需要知道要交互的同事類――聲卡類  this.soundCard = null;  this.setCdDriver = function(cdDriver) {    this.cdDriver = cdDriver;  }  this.setCpu = function(cpu) {    this.cpu = cpu;  }  this.setVideoCard = function(videoCard) {    this.videoCard = videoCard;  }  this.setSoundCard = function(soundCard) {    this.soundCard = soundCard;  }  this.changed = function(c) {    if(c instanceof CDDriver){      //表示光驅讀取數(shù)據(jù)了      this.opeCDDriverReadData(c);    }else if(c instanceof CPU){      this.opeCPU(c);    }  }  /**   * 處理光驅讀取數(shù)據(jù)以后與其他對象的交互   */  this.opeCDDriverReadData = function(cd){    //先獲取光驅讀取的數(shù)據(jù)    var data = cd.getData();    //把這些數(shù)據(jù)傳遞給CPU進行處理    cpu.executeData(data);  }  /**   * 處理CPU處理完數(shù)據(jù)后與其他對象的交互   */  this.opeCPU = function(cpu){    //先獲取CPU處理后的數(shù)據(jù)    var videoData = cpu.getVideoData();    var soundData = cpu.getSoundData();    //把這些數(shù)據(jù)傳遞給顯卡和聲卡展示出來    this.videoCard.showData(videoData);    this.soundCard.soundData(soundData);  }}

客戶端

//創(chuàng)建調停者――主板var mediator = new MainBoard();//創(chuàng)建同事類var cd = new CDDriver(mediator);var cpu = new CPU(mediator);var vc = new VideoCard(mediator);var sc = new SoundCard(mediator);//讓調停者知道所有同事mediator.setCdDriver(cd);mediator.setCpu(cpu);mediator.setVideoCard(vc);mediator.setSoundCard(sc);//開始看電影,把光盤放入光驅,光驅開始讀盤 cd.readCD();

打印效果

調停者模式的優(yōu)點

● 松散耦合:調停者模式通過把多個同事對象之間的交互封裝到調停者對象里面,從而使得同事對象之間松散耦合,基本上可以做到互補依賴。這樣一來,同事對象就可以獨立地變化和復用,而不再像以前那樣“牽一處而動全身”了。
● 集中控制交互:多個同事對象的交互,被封裝在調停者對象里面集中管理,使得這些交互行為發(fā)生變化的時候,只需要修改調停者對象就可以了,當然如果是已經(jīng)做好的系統(tǒng),那么就擴展調停者對象,而各個同事類不需要做修改。
● 多對多變成一對多:沒有使用調停者模式的時候,同事對象之間的關系通常是多對多的,引入調停者對象以后,調停者對象和同事對象的關系通常變成雙向的一對多,這會讓對象的關系更容易理解和實現(xiàn)。

調停者模式的缺點

調停者模式的一個潛在缺點是,過度集中化。如果同事對象的交互非常多,而且比較復雜,當這些復雜性全部集中到調停者的時候,會導致調停者對象變得十分復雜,而且難于管理和維護。

更多關于JavaScript相關內容可查看本站專題:《javascript面向對象入門教程》、《JavaScript切換特效與技巧總結》、《JavaScript查找算法技巧總結》、《JavaScript錯誤與調試技巧總結》、《JavaScript數(shù)據(jù)結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數(shù)學運算用法總結

希望本文所述對大家JavaScript程序設計有所幫助。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 吉林市| 宜丰县| 广安市| 张家港市| 定安县| 青川县| 门源| 柳州市| 伊川县| 常熟市| 叶城县| 施秉县| 英超| 云梦县| 当雄县| 乌拉特中旗| 上蔡县| 通榆县| 新津县| 英山县| 静安区| 和林格尔县| 惠州市| 全南县| 工布江达县| 探索| 即墨市| 兴国县| 辛集市| 闸北区| 桂林市| 安徽省| 泽州县| 安仁县| 云浮市| 区。| 龙门县| 石林| 东辽县| 顺义区| 洛宁县|