国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:3日期:2023-11-04 10:20:23

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

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

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

場景:我們對(duì)公司的人員架構(gòu)進(jìn)行一下打印,假設(shè)所有管理崗和開發(fā)崗的區(qū)別只有一個(gè),是不是有下級(jí)員工。我們來實(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

這里我們簡單寫的這個(gè)demo,用來對(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)原則。

接下來我們用組合模式實(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類來替換leader和rd類,其實(shí)這就是組合模式的關(guān)鍵:

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

組合模式總結(jié):

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

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

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

感興趣的朋友可以使用在線HTML/CSS/JavaScript代碼運(yùn)行工具:http://tools.jb51.net/code/HtmlJsRun測試上述代碼運(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ì)有所幫助。

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 伊人久久青草青青综合 | 国产欧美日韩一区二区三区在线 | 国产免费影院 | 国产盗摄一区二区三区 | 成年人网站黄 | 99视频在线精品 | 国产手机在线小视频免费观看 | 成人性动漫高清免费观看网址 | 亚洲巨乳自拍在线视频 | 久久生活片 | 老湿菠萝蜜在线看 | 中文字幕无线码中文字幕网站 | 亚洲国产精品乱码在线观看97 | 国产成人爱片免费观看视频 | 日韩精品在线免费观看 | 国产一级做a爰片久久毛片99 | 美国免费毛片 | 亚洲精品国产一区二区图片欧美 | 一级片成人 | 欧美jizzhd精品欧美另类 | 在线中文字幕播放 | 欧美一区二区三区不卡免费观看 | 欧美怡红院在线观看 | 国产成人欧美视频在线 | 免费乱码中文字幕网站 | 精品国产一区在线观看 | 久久精品国产一区二区三区 | 一区二区三区欧美日韩国产 | 欧美三级香港三级日本三级 | 国产综合久久一区二区三区 | 亚洲天堂二区 | 欧美一级二级三级 | 澳门一级毛片手机在线看 | 伊人99re| 久草在线2 | 欧美成在线 | 一级做a爰性色毛片 | 国产片91| 天天鲁天天爱天天鲁天天 | 国产在播放一区 | 九九在线免费观看视频 |