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

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

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

瀏覽:141日期: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類,而無需知道這個人是什么角色。可以對其進行統一處理。

組合模式總結:

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

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

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

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

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

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

標簽: JavaScript
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩二区三区在线观看| 亚洲影视一区二区三区| 午夜在线精品| а√在线中文在线新版| 亚洲最新av| 在线成人直播| 伊人久久高清| 欧美国产小视频| 日本国产欧美| 久久高清国产| 亚洲女同中文字幕| 私拍精品福利视频在线一区| 久久97视频| 国产精品一区二区av日韩在线 | 国产一区导航| 久久久久国产| 在线一区视频观看| 日韩久久电影| 久久精品国产999大香线蕉| 国产麻豆一区| 国产亚洲精品美女久久| 欧美亚洲色图校园春色| 91精品国产自产在线丝袜啪| 天堂久久一区| 国产欧美日韩亚洲一区二区三区| 午夜电影一区| 日韩精品免费观看视频| 欧美黑人巨大videos精品| 在线成人直播| 久久国产亚洲精品| 天堂网在线观看国产精品| 99免费精品| 日韩欧美中文字幕电影| 亚洲国产一区二区三区在线播放| 国产福利片在线观看| 精品国产一区二区三区2021| 国产精品亚洲人成在99www| 日韩欧美激情电影| 日韩精品免费视频人成| 国产精品v日韩精品v欧美精品网站 | 国产精品嫩模av在线| 日韩精品亚洲一区二区三区免费| 日本不卡视频一二三区| 国产精品久久久久av蜜臀 | 亚洲成人一区| 亚洲综合精品| 亚洲精品自拍| 久久精品99国产国产精| 麻豆精品新av中文字幕| 一区二区三区四区日本视频| 欧美二区视频| 亚洲精品婷婷| 国产精品99久久免费| 丰满少妇一区| 精精国产xxxx视频在线野外| 婷婷成人基地| 日韩精品高清不卡| 精品成av人一区二区三区| 久久久久久久欧美精品| 久久久亚洲一区| 亚洲丝袜美腿一区| 无码日韩精品一区二区免费| 国产精品v亚洲精品v日韩精品| 国产精品久久久久蜜臀 | 亚洲精品乱码日韩| 鲁大师精品99久久久| 日韩在线观看一区| 久久国产精品99国产| 国产视频一区二| 视频在线不卡免费观看| 国产尤物精品| 少妇精品久久久一区二区三区| 美女免费视频一区| 欧美日韩视频| 久久精品av麻豆的观看方式| 国产精品黑丝在线播放| 黄色日韩在线| 国产图片一区| 久久精品国产大片免费观看| 中文亚洲欧美| 久久av免费看| 最新日韩欧美| 国产精品99久久久久久董美香| 久久久久中文| 欧美亚洲tv| 久久人人精品| 日韩国产在线观看| 欧美国产美女| 亚洲人成亚洲精品| 福利一区二区| 日韩欧美三区| 欧美粗暴jizz性欧美20| 日韩中文字幕麻豆| 免费一区二区三区在线视频| 亚洲福利免费| 欧美日本三区| 亚洲一级高清| 欧美a级一区二区| 免费看欧美美女黄的网站| 国内精品伊人| 日韩精品一区二区三区av| 日韩欧美少妇| 国产精品一区免费在线| 黄色在线一区| 欧美亚洲日本精品| 日韩精品一区二区三区中文字幕| 成人看片网站| 日韩 欧美一区二区三区| 999久久久91| 国产美女视频一区二区| 美女精品在线| 日韩免费福利视频| 久久精品国产亚洲一区二区三区| 国产日韩高清一区二区三区在线| 麻豆高清免费国产一区| 日韩成人综合| 丝袜美腿一区| 国产中文在线播放| 97成人在线| 国产高清精品二区| 亚洲专区在线| 国产一区二区三区不卡av| 性色一区二区| 天堂中文在线播放| 久久国产精品免费一区二区三区| 在线一区免费| 播放一区二区| 超级白嫩亚洲国产第一| 国产精品亚洲成在人线| 亚洲网址在线观看| 噜噜噜躁狠狠躁狠狠精品视频| 日韩精品水蜜桃| 国产精品v日韩精品v欧美精品网站 | 日本不卡一区二区三区| 亚洲国产一区二区在线观看| 亚洲综合在线电影| 福利一区在线| 精品香蕉视频| 麻豆国产精品视频| 国产日韩一区| 国产美女精品| 九一国产精品| 激情久久久久久| 久久久久国产精品一区三寸| 欧美1区二区| 国产女人18毛片水真多18精品| 亚洲欧美网站在线观看| 视频在线观看91| 另类av一区二区| 亚洲综合精品| 亚洲中午字幕| 亚洲综合日本| 免费久久99精品国产| 国产精品毛片在线| 久热精品在线| 亚洲午夜国产成人| 日欧美一区二区| 美女精品在线观看| 黑丝一区二区三区| 91tv亚洲精品香蕉国产一区| 日韩免费高清| 欧美中文字幕一区二区| 不卡av一区二区| 模特精品在线| 日韩激情一二三区| 日韩av一区二区三区四区| 青青草国产成人99久久| 日韩va亚洲va欧美va久久| 日韩高清不卡在线| 欧美在线黄色| 国产免费久久| 久久亚洲黄色| bbw在线视频| 在线手机中文字幕| 狂野欧美性猛交xxxx| 国产精品不卡| 欧美黄色网页| 好看的av在线不卡观看| 蜜臀91精品一区二区三区| 日韩一区中文| 国产精品国码视频| 免费在线亚洲| 电影亚洲精品噜噜在线观看| 久久人人88| 免费成人在线视频观看| 97久久超碰| 国产网站在线| 丝袜美腿一区| 影音先锋久久| 性色av一区二区怡红| 在线精品福利| 国产亚洲一区| 亚洲欧美日韩精品一区二区| 亚洲欧洲专区| 国产精品蜜月aⅴ在线| 久久三级福利| 合欧美一区二区三区| 欧美片网站免费| 欧美大黑bbbbbbbbb在线| 激情久久99|