亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

javascript設(shè)計(jì)模式 – 組合模式原理與應(yīng)用實(shí)例分析

 更新時(shí)間:2020年04月14日 08:34:41   作者:李小強(qiáng)  
這篇文章主要介紹了javascript設(shè)計(jì)模式 – 組合模式,結(jié)合實(shí)例形式分析了javascript組合模式相關(guān)概念、原理、應(yīng)用場(chǎng)景及相關(guān)使用注意事項(xiàng),需要的朋友可以參考下

本文實(shí)例講述了javascript設(shè)計(jì)模式 – 組合模式原理與應(yīng)用。分享給大家供大家參考,具體如下:

介紹:組合模式又叫部分整體模式,用于把一組相似的對(duì)象當(dāng)作一個(gè)單一的對(duì)象。組合模式依據(jù)樹形結(jié)構(gòu)來(lái)組合對(duì)象,用來(lái)表示部分以及整體層次

定義:組合多個(gè)對(duì)象形成樹形結(jié)構(gòu)以表示具有整體一部分關(guān)系的層次機(jī)構(gòu)。組合模式對(duì)單個(gè)對(duì)象(即葉子對(duì)象)和組合對(duì)象(即容器對(duì)象)的使用具有一致性,組合模式又可以成為整體一部分模式。
它是一種對(duì)象結(jié)構(gòu)型模式。

場(chǎng)景:我們對(duì)公司的人員架構(gòu)進(jìn)行一下打印,假設(shè)所有管理崗和開發(fā)崗的區(qū)別只有一個(gè),是不是有下級(jí)員工。我們來(lái)實(shí)現(xiàn)下:

示例:

var LEADER = function(name,dept){
  this._name = name || '';  //姓名
  this._dept = dept || '';  //職位
  this._subordinates = [];  //下屬
 
  this.add = function(employee){
    this._subordinates.push(employee);
  }
 
  this.remove = function(employee){
    this._subordinates.splice(this._subordinates.indexOf(employee),1);
  }
 
  this.getSubordinates = function(){
    return this._subordinates;
  }
  this.toString = function(){
    console.log('姓名:'+this._name+',職位:'+this._dept)
  }
}
var JAVARD = function(name,dept){
  this._name = name || '';  //姓名
  this._dept = dept || '';  //職位
 
  this.toString = function(){
    console.log('姓名:'+this._name+',職位:'+this._dept)
  }
}
 
var FERD = function(name,dept){
  this._name = name || '';  //姓名
  this._dept = dept || '';  //職位
  this.toString = function(){
    console.log('姓名:'+this._name+',職位:'+this._dept)
  }
}
 
function addData(){
  var CEO = new LEADER('spancer','CEO');
 
  var CTO = new LEADER('zijian','CTO');
 
  var MANAGER = new LEADER('jiang','LEADER');
 
  var JAVA_LEADER = new LEADER('fei','JAVA_LEADER');
  var FE_LEADER = new LEADER('risker','FE_LEADER');
 
  var wh = new FERD('wanghui','FE');
  var si = new FERD('si','FE');
  var amy = new FERD('amy','FE');
 
  var wei = new JAVARD('wei','JAVA');
  var guo = new JAVARD('guo','JAVA');
  var yuan = new JAVARD('yuan','JAVA');
 
  CEO.add(CTO);
 
  CTO.add(MANAGER);
 
  MANAGER.add(JAVA_LEADER);
  MANAGER.add(FE_LEADER);
 
  FE_LEADER.add(wh);
  FE_LEADER.add(si);
  FE_LEADER.add(amy);
 
  JAVA_LEADER.add(wei);
  JAVA_LEADER.add(guo);
  JAVA_LEADER.add(yuan);
  return CEO;
}
var eachEmployee = function(employee){
  for(var employ of employee.getSubordinates()){
    employ.toString();
    if(employ.getSubordinates && employ.getSubordinates().length > 0){
      eachEmployee(employ);
    }
  }
}
 
var CEO = addData();
CEO.toString();
eachEmployee(CEO);
// 姓名:spancer,職位:CEO
// 姓名:zijian,職位:CTO
// 姓名:jiang,職位:LEADER
// 姓名:fei,職位:JAVA_LEADER
// 姓名:wei,職位:JAVA
// 姓名:guo,職位:JAVA
// 姓名:yuan,職位:JAVA
// 姓名:risker,職位:FE_LEADER
// 姓名:wanghui,職位:FE
// 姓名:si,職位:FE
// 姓名:amy,職位:FE

這里我們簡(jiǎn)單寫的這個(gè)demo,用來(lái)對(duì)公司組織架構(gòu)進(jìn)行遍歷輸出。因?yàn)閞d和leader具體職能的不同,我們把技術(shù)和管理分為兩大類。但是這樣的設(shè)計(jì)存在很多問題:

* 可擴(kuò)展性差,當(dāng)一個(gè)新的職位產(chǎn)生,在對(duì)其歸類時(shí)是新增一個(gè)還是放到已有類目下面都是一個(gè)問題。
* 當(dāng)某一行為發(fā)生變化需要挨個(gè)修改leader類rd類,不符合開關(guān)原則。

接下來(lái)我們用組合模式實(shí)現(xiàn)下:

var Employee = function(name, dept){
  this._name = name || '';  //姓名
  this._dept = dept || '';  //職位
  this._subordinates = [];  //下屬
 
  this.add = function(employee){
    this._subordinates.push(employee);
  }
 
  this.remove = function(employee){
    this._subordinates.splice(this._subordinates.indexOf(employee),1);
  }
 
  this.getSubordinates = function(){
    return this._subordinates;
  }
  this.toString = function(){
    console.log('姓名:'+this._name+',職位:'+this._dept)
  }
}
 
function addData(){
  var CEO = new Employee('spancer','CEO');
 
  var CTO = new Employee('zijian','CTO');
 
  var LEADER = new Employee('jiang','LEADER');
 
  var JAVA_LEADER = new Employee('fei','JAVA_LEADER');
  var FE_LEADER = new Employee('risker','FE_LEADER');
 
  var wh = new Employee('wanghui','FE');
  var si = new Employee('si','FE');
  var amy = new Employee('amy','FE');
 
  var wei = new Employee('wei','JAVA');
  var guo = new Employee('guo','JAVA');
  var yuan = new Employee('yuan','JAVA');
 
  CEO.add(CTO);
 
  CTO.add(LEADER);
 
  LEADER.add(JAVA_LEADER);
  LEADER.add(FE_LEADER);
 
  FE_LEADER.add(wh);
  FE_LEADER.add(si);
  FE_LEADER.add(amy);
 
  JAVA_LEADER.add(wei);
  JAVA_LEADER.add(guo);
  JAVA_LEADER.add(yuan);
  return CEO;
}
var eachEmployee = function(employee){
  for(var employ of employee.getSubordinates()){
    employ.toString();
    if(employ.getSubordinates().length > 0){
      eachEmployee(employ);
    }
  }
}
 
var CEO = addData();
CEO.toString();
eachEmployee(CEO);
// 姓名:spancer,職位:CEO
// 姓名:zijian,職位:CTO
// 姓名:jiang,職位:LEADER
// 姓名:fei,職位:JAVA_LEADER
// 姓名:wei,職位:JAVA
// 姓名:guo,職位:JAVA
// 姓名:yuan,職位:JAVA
// 姓名:risker,職位:FE_LEADER
// 姓名:wanghui,職位:FE
// 姓名:si,職位:FE
// 姓名:amy,職位:FE

大家可以對(duì)比下兩段代碼的差異,我們用一個(gè)Employee類來(lái)替換leader和rd類,其實(shí)這就是組合模式的關(guān)鍵:

定義一個(gè)抽象類,它既可以代表leader也可以代表rd,添加、打印時(shí)也基于Employee類,而無(wú)需知道這個(gè)人是什么角色??梢詫?duì)其進(jìn)行統(tǒng)一處理。

組合模式總結(jié):

優(yōu)點(diǎn):
* 可以清楚的定義存在層次關(guān)系的復(fù)雜對(duì)象,讓客戶端開發(fā)過程中忽略層次的差異
* 全局修改時(shí),只需修改一處位置

缺點(diǎn):
* 無(wú)法對(duì)生成結(jié)果進(jìn)行限制,不能像第一個(gè)例子一樣,所有的rd都沒有下級(jí)員工屬性,也沒有對(duì)應(yīng)方法。所以在使用時(shí)要注意這些約束

適用場(chǎng)景;
* 在一個(gè)面向?qū)ο蟮恼Z(yǔ)言開發(fā)系統(tǒng)中需要處理一個(gè)樹形結(jié)構(gòu)。
* 在具有整體和部分的結(jié)構(gòu)中,希望忽略掉二者差異,使客戶端一致對(duì)待。

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具http://tools.jb51.net/code/HtmlJsRun測(cè)試上述代碼運(yùn)行效果。

更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《javascript面向?qū)ο笕腴T教程》、《JavaScript錯(cuò)誤與調(diào)試技巧總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript遍歷算法與技巧總結(jié)》及《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)

希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。

相關(guān)文章

  • bootstrap學(xué)習(xí)筆記之初識(shí)bootstrap

    bootstrap學(xué)習(xí)筆記之初識(shí)bootstrap

    Bootstrap是一款目前非常流行的前端框架,簡(jiǎn)單的說,就是html,css,javascript的工具集。本文給大家介紹bootstrap學(xué)習(xí)筆記之初識(shí)bootstrap,感興趣的朋友一起學(xué)習(xí)吧
    2016-06-06
  • JS繼承與閉包及JS實(shí)現(xiàn)繼承的三種方式

    JS繼承與閉包及JS實(shí)現(xiàn)繼承的三種方式

    大家都知道,面向?qū)ο蟮娜筇卣鳌庋b、繼承、多態(tài)。下面通過本文給大家介紹JS繼承與閉包及JS實(shí)現(xiàn)繼承的三種方式,感興趣的朋友一起看看吧
    2017-10-10
  • 通過掃小程序碼實(shí)現(xiàn)網(wǎng)站登陸功能

    通過掃小程序碼實(shí)現(xiàn)網(wǎng)站登陸功能

    這篇文章主要介紹了通過掃小程序碼實(shí)現(xiàn)網(wǎng)站登陸功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-08-08
  • 深入淺析javascript函數(shù)中with

    深入淺析javascript函數(shù)中with

    這篇文章主要介紹了javascript函數(shù)中with,with函數(shù)方便用來(lái)引用某個(gè)對(duì)象中已有的屬性,但是不能用來(lái)給對(duì)象添加屬性,要給對(duì)象創(chuàng)建新的屬性,下面通過代碼給大家講解,需要的朋友可以參考下
    2018-10-10
  • JS限制文本框只能輸入數(shù)字和字母方法

    JS限制文本框只能輸入數(shù)字和字母方法

    這篇文章主要介紹了JS限制文本框只能輸入數(shù)字和字母方法,本文給出了限制只能輸入數(shù)字、限制只能輸入字母、限制只能輸入數(shù)字和字母3種腳本,需要的朋友可以參考下
    2015-02-02
  • JavaScript通過事件代理高亮顯示表格行的方法

    JavaScript通過事件代理高亮顯示表格行的方法

    這篇文章主要介紹了JavaScript通過事件代理高亮顯示表格行的方法,涉及javascript事件代理及頁(yè)面元素的操作技巧,需要的朋友可以參考下
    2015-05-05
  • 細(xì)說JavaScript中的this指向與綁定規(guī)則

    細(xì)說JavaScript中的this指向與綁定規(guī)則

    本文主要詳細(xì)介紹了JavaScript中的this指向與綁定規(guī)則,默認(rèn)綁定,隱式綁定,顯示綁定,new綁定這四個(gè)規(guī)則,文中有相關(guān)的代碼示例供大家參考,感興趣的同學(xué)可以閱讀下
    2023-05-05
  • js獲取地址欄參數(shù)的兩種方法

    js獲取地址欄參數(shù)的兩種方法

    這篇文章主要為大家詳細(xì)介紹了js獲取地址欄參數(shù)的兩種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • 每天一篇javascript學(xué)習(xí)小結(jié)(RegExp對(duì)象)

    每天一篇javascript學(xué)習(xí)小結(jié)(RegExp對(duì)象)

    這篇文章主要介紹了javascript中的RegExp對(duì)象知識(shí)點(diǎn),對(duì)RegExp對(duì)象的基本使用方法,以及各種方法進(jìn)行整理,感興趣的小伙伴們可以參考一下
    2015-11-11
  • 原生JS實(shí)現(xiàn)圖片跑馬燈特效

    原生JS實(shí)現(xiàn)圖片跑馬燈特效

    這篇文章主要為大家詳細(xì)介紹了原生JS實(shí)現(xiàn)圖片跑馬燈特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10

最新評(píng)論