日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

《javascript設計模式》學習筆記七:Javascript面向對象程序設計組合模式詳解

瀏覽:142日期:2023-11-05 16:07:22

本文實例講述了Javascript面向對象程序設計組合模式。分享給大家供大家參考,具體如下:

概述

關于組合模式的定義:組合模式(Composite Pattern)有時候又叫做部分-整體模式,它使我們樹型結構的問題中,模糊了簡單元素和復雜元素的概念,客戶程序可以向處理簡單元素一樣來處理復雜元素,從而使得客戶程序與復雜元素的內部結構解耦。來自百度百科:http://baike.baidu.com/view/3591789.htm

其實從面向對象之五之后,與javascript本身關系不是很大,更重要的是設計模式的一些概念,只要了解javascript面向對象的一般知識,掌握設計模式的含義,代碼本身并不是很難。

這里簡單說一下組合模式,其實組合模式就是將一系列相似或相近的對象組合在一個大的對象,由這個大對象提供一些常用的接口來對這些小對象進行操作,代碼可重用,對外操作簡單。例如對于一個form里的元素,不考慮頁面設計的情況下,一般就剩下input了,對于這些input都有name和value的屬性,因此可以將這些input元素作為form對象的成員組合起來,form對象提供對外的接口,便可以實現一些簡單的操作,比如設置某個input的value,添加/刪除某個input等等……

正文

介紹:組合模式又叫部分整體模式,用于把一組相似的對象當作一個單一的對象。組合模式依據樹形結構來組合對象,用來表示部分以及整體層次

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

場景:我們對公司的人員架構進行一下打印,假設所有管理崗和開發崗的區別只有一個,是不是有下級員工。我們來實現下:

示例:

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

這里我們簡單寫的這個demo,用來對公司組織架構進行遍歷輸出。因為rd和leader具體職能的不同,我們把技術和管理分為兩大類。但是這樣的設計存在很多問題:

* 可擴展性差,當一個新的職位產生,在對其歸類時是新增一個還是放到已有類目下面都是一個問題。* 當某一行為發生變化需要挨個修改leader類rd類,不符合開關原則。

接下來我們用組合模式實現下:

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

大家可以對比下兩段代碼的差異,我們用一個Employee類來替換leader和rd類,其實這就是組合模式的關鍵:定義一個抽象類,它既可以代表leader也可以代表rd,添加、打印時也基于Employee類,而無需知道這個人是什么角色??梢詫ζ溥M行統一處理。

組合模式總結:

優點:* 可以清楚的定義存在層次關系的復雜對象,讓客戶端開發過程中忽略層次的差異* 全局修改時,只需修改一處位置

缺點:* 無法對生成結果進行限制,不能像第一個例子一樣,所有的rd都沒有下級員工屬性,也沒有對應方法。所以在使用時要注意這些約束

適用場景;* 在一個面向對象的語言開發系統中需要處理一個樹形結構。* 在具有整體和部分的結構中,希望忽略掉二者差異,使客戶端一致對待。

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

更多關于JavaScript相關內容感興趣的讀者可查看本站專題:《javascript面向對象入門教程》、《JavaScript錯誤與調試技巧總結》、《JavaScript數據結構與算法技巧總結》、《JavaScript遍歷算法與技巧總結》及《JavaScript數學運算用法總結》

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

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
免费精品视频| 国产精品二区不卡| 久久精品国产亚洲aⅴ| 亚洲欧洲国产精品一区| 日本v片在线高清不卡在线观看| 亚洲视频播放| 亚洲一区二区三区四区电影| 99久久婷婷| 视频一区欧美精品| 一二三区精品| 91精品国产一区二区在线观看| 国产伦理一区| 成人在线黄色| 国产精品激情| 九九九精品视频| 视频福利一区| 中文字幕一区二区精品区| 亚洲va久久| 国产福利资源一区| 日本美女一区| 男人操女人的视频在线观看欧美| 日本在线观看不卡视频| 日韩精品高清不卡| 国产成人精品福利| 国产农村妇女精品一区二区| 精品亚洲成人| 午夜欧美在线| 国产精品欧美大片| 欧美日韩在线二区| 亚洲精品动态| 国产美女高潮在线| 在线亚洲自拍| 国产一区精品福利| 蜜桃久久久久久| 色偷偷偷在线视频播放| 亚洲视频国产精品| 国产福利片在线观看| 99成人超碰| 亚洲综合图色| 亚洲香蕉网站| 国产精品久久亚洲不卡| 亚洲欧美日本日韩| 中文字幕在线看片| 日韩精品欧美大片| 精品在线91| 91视频一区| 国产欧美日韩一级| 亚洲精品黄色| 亚洲一区二区三区高清不卡| 福利视频一区| 青草久久视频| 狠狠色狠狠色综合日日tαg| 欧美亚洲综合视频| 久久福利影视| 国产一区久久| 久久九九精品| zzzwww在线看片免费| 欧美日本二区| 国产日韩亚洲| 国产精品任我爽爆在线播放 | 精品中文在线| 欧美天堂一区| 亚洲精品国模| 蜜臀91精品一区二区三区| 亚州av乱码久久精品蜜桃| 韩国久久久久久| 人人精品亚洲| 欧美中文字幕一区二区| 久久久水蜜桃av免费网站| 日韩亚洲一区在线| 成人久久久久| 99久久视频| 久久亚洲风情| 日本久久一区| 免费日韩视频| 亚洲精品第一| 国产精品久久久久久久免费软件| 亚洲+小说+欧美+激情+另类| 综合国产视频| 久久av综合| 欧美日韩尤物久久| 蜜桃视频第一区免费观看| 日本伊人久久| 精品国产乱码| 黑丝一区二区三区| 国产日产一区| 韩国三级一区| 亚洲欧美不卡| 亚洲精品欧美| 色综合狠狠操| 日韩精品一二三| 精品久久福利| 欧美日韩国产一区精品一区| 亚洲欧美一级| 丝袜诱惑一区二区| 最新国产精品| 99精品电影| 欧美视频久久| 欧美精品九九| 麻豆一区二区在线| 亚洲一区免费| 亚洲综合电影| 爽好多水快深点欧美视频| 国产精品啊v在线| 免费看久久久| 亚洲一区二区小说| av一区在线| 91av亚洲| 欧美日韩中文一区二区| 先锋影音国产一区| 精品国产鲁一鲁****| 日韩高清一区在线| 久久视频国产| 欧美激情福利| 日韩不卡手机在线v区| 国产精品一区毛片| 日韩一区二区三区免费播放| 久久国产婷婷国产香蕉| 日韩在线一二三区| 日韩精品欧美| 亚洲日本国产| 蜜桃久久久久久久| 欧美日韩激情在线一区二区三区| 欧美久久精品| 日韩在线观看中文字幕| 久久xxxx| 视频一区视频二区中文字幕| 欧美+日本+国产+在线a∨观看| 国产一区二区三区精品在线观看| 青青草国产成人99久久| 成人av动漫在线观看| 99视频精品视频高清免费| 日韩一区二区三区在线免费观看| 日韩一区二区三区免费播放| 伊人网在线播放| 国产91在线精品| 亚洲成av在线| 日韩成人综合| 国产综合精品一区| 精品日韩毛片| 久久国产精品久久久久久电车| 国产精品外国| 国产毛片精品久久| 韩日一区二区| 欧美福利专区| 欧美精品一线| 欧美在线91| 精品一区二区三区中文字幕在线| 久久av日韩| 精品国产一区二区三区av片| 天堂√中文最新版在线| 午夜欧美精品| 四虎精品永久免费| 国产精品不卡| 久久午夜视频| 福利精品一区| 日韩视频在线一区二区三区 | 国产亚洲观看| 欧美日韩视频免费观看| 日韩欧美视频专区| 亚洲人成亚洲精品| 精品视频91| 蜜桃av一区二区在线观看| 国产精品亚洲成在人线| 亚洲精品va| 激情不卡一区二区三区视频在线| 日韩精品永久网址| 国产日产一区| 亚洲精品在线国产| 不卡一区综合视频| 高清一区二区| 欧美影院视频| 亚洲在线久久| 视频一区视频二区中文字幕| 日本午夜大片a在线观看| 免费av一区| 久久不见久久见中文字幕免费| 性欧美长视频| 天堂日韩电影| 国产一区二区三区日韩精品| 少妇精品久久久一区二区三区| 国产成人77亚洲精品www| 日韩精品一区二区三区中文| 韩国精品主播一区二区在线观看| 欧美视频二区| 日本亚洲欧美天堂免费| 91精品推荐| 国产66精品| 日产精品一区二区| 国产精品久久国产愉拍| 日本不卡一二三区黄网| 久久电影一区| 久久精品欧美一区| 日本精品影院| 秋霞影视一区二区三区| 日韩国产网站| 国产乱码午夜在线视频| 免费高潮视频95在线观看网站| 成人精品国产亚洲| 色偷偷色偷偷色偷偷在线视频|