成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:108日期: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
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
影音先锋亚洲电影| 性久久久久久| 亚洲国产精品一区二区第四页av| 亚洲人成7777| 欧美一区二区精品在线| 最新国产拍偷乱拍精品| 国产一区二区三区综合 | 久久嫩草精品久久久久| 国产欧美大片| 国内精品不卡在线| 亚洲欧美欧美一区二区三区| 91麻豆精品国产综合久久久久久| 成人一区二区在线观看| 午夜天堂影视香蕉久久| 国产精品女人毛片| 欧美一激情一区二区三区| 影音先锋久久| av在线一区二区| 极品美女销魂一区二区三区 | 97se狠狠狠综合亚洲狠狠| 六月婷婷色综合| 亚洲色欲色欲www| 精品国产成人系列| 欧美中文字幕久久| 亚洲在线免费| 红桃视频国产精品| 奇米在线7777在线精品 | 高清不卡一区二区在线| 天堂av在线一区| 亚洲欧美日本在线| |精品福利一区二区三区| 久久久久久久免费视频了| 欧美人狂配大交3d怪物一区| 欧美亚洲免费高清在线观看| 国产综合精品一区| 99视频精品在线| 国产成人在线影院| 久久99热国产| 蜜桃久久精品一区二区| 亚洲成a人v欧美综合天堂下载| 国产人妖乱国产精品人妖| 久久久国产精品麻豆| 精品蜜桃在线看| 日韩一区二区三| 日韩欧美不卡在线观看视频| 欧美丰满少妇xxxbbb| 欧美三级日韩三级国产三级| 欧美日韩在线三级| 欧美天天综合网| 欧美丝袜自拍制服另类| 色天天综合久久久久综合片| 国产农村妇女精品一区二区| 一区二区高清视频| av不卡在线| 国产精品五区| 亚洲午夜在线| 狠狠色噜噜狠狠色综合久| 黄色国产精品| 精品不卡在线| 一区二区三区你懂的| 国产毛片久久| 欧美性大战久久久久久久| 制服丝袜中文字幕一区| 日韩你懂的电影在线观看| 在线播放日韩导航| 日韩欧美在线网站| 久久综合久久综合久久综合| 久久久久久久久99精品| 欧美国产精品v| 国产欧美精品区一区二区三区| 日韩三级.com| 欧美国产日本韩| 亚洲在线成人精品| 日产欧产美韩系列久久99| 久久99国产精品尤物| 成人av在线一区二区| 黄色欧美成人| 在线精品视频小说1| 欧美日韩精品专区| 国产亚洲欧美日韩日本| 日韩理论片在线| 亚洲成av人片在www色猫咪| 国产精品一区二区黑丝| 91丨porny丨在线| 亚洲国产欧美日韩| 麻豆久久婷婷| 日韩一区二区三区四区| 国产精品区一区二区三区| 亚洲第一在线综合网站| 国产精品白丝jk黑袜喷水| 欧美区亚洲区| 精品视频1区2区| 中文字幕巨乱亚洲| 爽爽淫人综合网网站| 成人免费的视频| 一区二区三区免费看| 日韩一区二区免费高清| 亚洲与欧洲av电影| 99精品视频一区二区三区| 久久av一区二区三区| 久久婷婷综合激情| 午夜一区二区三区视频| av亚洲精华国产精华精| 乱码第一页成人| 国产色产综合色产在线视频| 天堂在线一区二区| 欧美在线日韩精品| 7777精品伊人久久久大香线蕉| 一区二区在线观看免费视频播放| 成人综合婷婷国产精品久久| 色吊一区二区三区 | 国产精品综合在线视频| 国产精品久久亚洲7777| 精品成人佐山爱一区二区| 首页欧美精品中文字幕| 欧美呦呦网站| 欧美精三区欧美精三区| 一区二区三区在线观看欧美| 91麻豆视频网站| 欧美日本一区二区三区四区| 亚洲激情成人在线| 欧美成人免费在线| 日韩一区二区三区四区 | 色婷婷综合久久久中文一区二区 | 久久精品一区二区三区中文字幕| 久久久精品免费网站| 国产精品性做久久久久久| 一本色道久久综合亚洲91| |精品福利一区二区三区| 欧美精品一区二区三区在线看午夜| 欧美高清激情brazzers| 视频一区在线播放| 亚洲夜间福利| www久久精品| 成人精品免费视频| 欧美精选午夜久久久乱码6080| 另类综合日韩欧美亚洲| 免费日韩视频| 亚洲最大的成人av| av成人黄色| 综合激情成人伊人| 欧美日韩国产综合视频在线| 精品久久久久久无| 懂色av一区二区三区免费看| 538在线一区二区精品国产| 久久精品72免费观看| 色av成人天堂桃色av| 亚洲成av人片在线| 裸体一区二区| 理论片日本一区| 欧美午夜理伦三级在线观看| 九色porny丨国产精品| 欧美男同性恋视频网站| 激情综合一区二区三区| 777久久久精品| 成人午夜免费视频| 精品国产乱码久久久久久影片| 成人免费毛片app| 国产亚洲一区二区三区在线观看| 91亚洲精品久久久蜜桃| 国产精品欧美一区二区三区| 一本色道久久综合亚洲精品高清| 一区二区三区不卡视频在线观看| 国产一级一区二区| 视频一区在线视频| 欧美性一级生活| 久久99国内精品| 欧美一卡二卡在线| 91在线观看一区二区| 国产精品久久久久久亚洲毛片 | 欧美私人啪啪vps| 亚洲色图在线看| 色婷婷av一区二区三区gif | 欧美日韩一区不卡| 99精品久久免费看蜜臀剧情介绍 | 国产精品77777| 久久久精品国产99久久精品芒果 | 欧美人与禽zozo性伦| 成人激情黄色小说| 日韩伦理电影网| 欧洲精品视频在线观看| 国产成人午夜精品5599 | 成人一区二区视频| 亚洲精品水蜜桃| 在线观看中文字幕不卡| a级精品国产片在线观看| 中文字幕一区二区三区不卡 | 欧美岛国在线观看| 国产毛片久久| 国产成人亚洲精品狼色在线| 国产精品青草久久| 欧美色综合久久| 欧美日韩国内| 蜜臀91精品一区二区三区 | 国产一区视频网站| 亚洲激情校园春色| 久久先锋影音av鲁色资源网| 在线视频综合导航| 在线日本成人| 成人午夜在线播放|