JavaScript組合模式---引入案例分析
本文實(shí)例講述了JavaScript組合模式。分享給大家供大家參考,具體如下:
首先:
使用一個(gè)例子來引入組合模式,需求為
(1)有一個(gè)學(xué)校有2個(gè)班(一班,二班)
(2)每個(gè)班級(jí)分2個(gè)小組(一班一組,一班二組,二班一組,二班二組)
(3)學(xué)校計(jì)算機(jī)教室有限,每一個(gè)小組分著來上課
然后:根據(jù)需求我們可以簡(jiǎn)單看出這里面涉及到 學(xué)校,班級(jí),組,和學(xué)生總共4個(gè)類
使用程序模擬 這4個(gè)類為,
(1)學(xué)校類
var school=function (name) { this.name=name; var classes=new Array(); this.addClasses=function (cla) { classes.push(classe); } this.getClass=function () { return classes; } }
(2)班級(jí)類
//班級(jí)類 var classes=function (name) { this.name = name; var groups = new Array(); this.addGroup = function (group) { groups.push(group); return this; }; this.getGroups = function () { return groups; } };
(3)組類
//組 var group=function (name) { this.name=name; var students=new Array(); var addStudents=function (student) { students.push(student); return this; } this.geStudent=function () { return students; } };
(4)學(xué)生類
//學(xué)生類 var student=function (name) { this.name=name; this.gotoClass=function () { document.write(name+":我是學(xué)生,我要去上課 ") }; this.finishClass=function () { document.write(name+": 終于下課了"); } };
其次,測(cè)試需滿足如下為:
(1)每個(gè)班級(jí)分2個(gè)小組(一班一組,一班二組,二班一組,二班二組)
(2)學(xué)校計(jì)算機(jī)教室有限,每一個(gè)小組的學(xué)生分著來上課
(3)現(xiàn)在我們倒著寫,從學(xué)生-->組->班級(jí)-->學(xué)校
//學(xué)生實(shí)例 var astudent=new student("我是a同學(xué)"); var bstudent=new student("我是b同學(xué)"); var cstudent=new student("我是c同學(xué)"); var dstudent=new student("我是d同學(xué)"); var estudent=new student("我是e同學(xué)"); var fstudent=new student("我是f同學(xué)"); var gstudent=new student("我是g同學(xué)"); var hstudent=new student("我是h同學(xué)"); var istudent=new student("我是i同學(xué)"); //班級(jí)實(shí)例(1) var class1=new classes("一班"); //組1 var oneOne=new group("一班一組"); //組中添加學(xué)生 oneOne.addStudents(astudent).addStudents(bstudent); //組2 var oneTwo=new group("一班二組"); //組中添加學(xué)生 oneTwo.addStudents(cstudent).addStudents(dstudent); class1.addGroup(oneOne).addGroup(oneTwo); //班級(jí)實(shí)例2 var class2=new classes("二班"); //組1 var towOne=new group("二班一組"); //組中添加學(xué)生 towOne.addStudents(estudent).addStudents(fstudent); //組2 var towTwo=new group("二班二組"); //組中添加學(xué)生 towTwo.addStudents(gstudent).addStudents(hstudent).addStudents(istudent); // class2.addGroup(towOne).addGroup(towTwo); //學(xué)校實(shí)例 var usSchool=new school("組合模式學(xué)校");
最后,開學(xué)了,我們準(zhǔn)備按照要求去上課吧,
安排為:一班一組去上課 學(xué)校-->班級(jí)-->組-->學(xué)生
var classes=usSchool.getClass();//班級(jí) for(var i=0;i<classes.length;i++){ if(classes[i].name=="一班"){ for(var j=0;j<classes[i].getGroups().length;j++){ if(classes[i].classes[i].getGroups()[j]=="一組"){ var students=classes[i].classes[i].getGroups()[j].geStudent(); for(var k=0;k<students.length;k++){ students[k].gotoClass(); } } } } }
最后,我只是想安排一個(gè)都要寫這么多的代碼,那如何是一個(gè)學(xué)校有上千個(gè)班級(jí),那么要瘋了。
這種一定不適合業(yè)務(wù)的擴(kuò)展,為此我們使用組合模式來解決上述的問題。
為啥要用設(shè)計(jì)模式呢?
因?yàn)樵O(shè)計(jì)模式有如下的一些操作方式:
(1)組合模式中把對(duì)象分為兩種(組合對(duì)象,和葉子對(duì)象)
(2)組合對(duì)象和葉子對(duì)象實(shí)現(xiàn):同一批操作
(3)對(duì)組合對(duì)象執(zhí)行的操作可以向下傳遞到葉子節(jié)點(diǎn)進(jìn)行操作
(4)這樣就會(huì)弱化類與類之間的耦合
(5)他常用的手法是把對(duì)象組合成屬性結(jié)構(gòu)的對(duì)象
接下來介紹:JavaScript組合設(shè)模式--改進(jìn)上述引入的例子
感興趣的朋友可以使用在線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)文章
JavaScript樹形組件實(shí)現(xiàn)無限級(jí)樹形結(jié)構(gòu)
這篇文章主要介紹了JavaScript樹形組件實(shí)現(xiàn)無限級(jí)樹形結(jié)構(gòu),一種構(gòu)建多級(jí)有序樹形結(jié)構(gòu)JSON(或XML)數(shù)據(jù)源的方法,下面更多相關(guān)資料需要的小伙伴可以參考一下2022-03-03input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法)
這篇文章主要介紹了input 標(biāo)簽實(shí)現(xiàn)輸入框帶提示文字效果(兩種方法),需要的朋友可以參考下2017-10-10解決js數(shù)據(jù)包含加號(hào)+通過ajax傳到后臺(tái)時(shí)出現(xiàn)連接錯(cuò)誤
測(cè)試過程中發(fā)現(xiàn)js數(shù)據(jù)包含加號(hào)+通過ajax傳到后臺(tái)時(shí)出現(xiàn)連接錯(cuò)誤,刪除+,鏈接暢通了,果然是這塊問題,對(duì)加號(hào)進(jìn)行轉(zhuǎn)義2013-08-08javascript 兼容所有瀏覽器的DOM擴(kuò)展功能
技術(shù)文章寫得少,所以有時(shí)候想寫點(diǎn)什么卻下不了手,不知道該寫什么;往往到了準(zhǔn)備要寫的時(shí)候才發(fā)現(xiàn)自己想寫的東西其實(shí)很無聊,甚至覺得很幼稚,于是又關(guān)掉了編緝器2012-08-08輕量級(jí)的原生js日歷插件calendar.js使用指南
網(wǎng)頁上的原生js日歷代碼,鼠標(biāo)點(diǎn)擊文字提示處,會(huì)顯示一個(gè)帶年月日的日歷窗口,可調(diào)整年份、月份、選擇日期等,用在網(wǎng)頁上方便大家選擇日期,提高用戶體驗(yàn)。各大瀏覽器都能正常運(yùn)行,有需要的小伙伴可以參考下。2015-04-04基于rollup的組件庫打包體積優(yōu)化小結(jié)
這篇文章主要介紹了基于rollup的組件庫打包體積優(yōu)化小結(jié),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-06-06javascript實(shí)現(xiàn)仿騰訊游戲選擇
這篇文章主要介紹了javascript實(shí)現(xiàn)仿騰訊游戲選擇,簡(jiǎn)單實(shí)現(xiàn)的下拉菜單二級(jí)聯(lián)動(dòng)效果,十分不錯(cuò),有需要的小伙伴可以參考下。2015-05-05