成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

js設(shè)計(jì)模式--組合模式

blankyao / 925人閱讀

摘要:文章系列設(shè)計(jì)模式單例模式設(shè)計(jì)模式策略模式設(shè)計(jì)模式代理模式設(shè)計(jì)模式迭代器模式設(shè)計(jì)模式發(fā)布訂閱模式設(shè)計(jì)模式命令模式概念組合模式就是用小的子對(duì)象來(lái)構(gòu)建更大的對(duì)象,而這些小的子對(duì)象本身也許是由更小的孫對(duì)象構(gòu)成的。

前言

本系列文章主要根據(jù)《JavaScript設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐》整理而來(lái),其中會(huì)加入了一些自己的思考。希望對(duì)大家有所幫助。

文章系列

js設(shè)計(jì)模式--單例模式

js設(shè)計(jì)模式--策略模式

js設(shè)計(jì)模式--代理模式

js設(shè)計(jì)模式--迭代器模式

js設(shè)計(jì)模式--發(fā)布訂閱模式

js設(shè)計(jì)模式--命令模式

概念

組合模式就是用小的子對(duì)象來(lái)構(gòu)建更大的對(duì)象,而這些小的子對(duì)象本身也許是由更小的“孫對(duì)象”構(gòu)成的。

場(chǎng)景

組合模式除了要求組合對(duì)象和葉對(duì)象擁有相同的接口之外,還有一個(gè)必要條件,就是對(duì)一組葉對(duì)象的操作必須具有一致性。

優(yōu)缺點(diǎn) 優(yōu)點(diǎn)

組合模式將對(duì)象組合成樹(shù)形結(jié)構(gòu),以表示“部分-整體”的層次結(jié)構(gòu)。 除了用來(lái)表示樹(shù)形結(jié) 構(gòu)之外,組合模式的另一個(gè)好處是通過(guò)對(duì)象的多態(tài)性表現(xiàn),使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使 用具有一致性

缺點(diǎn)

它可能會(huì)產(chǎn)生一個(gè)這樣的系統(tǒng):系統(tǒng)中的每個(gè)對(duì)象看起來(lái)都 與其他對(duì)象差不多。它們的區(qū)別只有在運(yùn)行的時(shí)候會(huì)才會(huì)顯現(xiàn)出來(lái),這會(huì)使代碼難以理解。此外, 如果通過(guò)組合模式創(chuàng)建了太多的對(duì)象,那么這些對(duì)象可能會(huì)讓系統(tǒng)負(fù)擔(dān)不起。

例子 掃描文件夾

這里把文件和文件夾無(wú)區(qū)別對(duì)待,文件和文件夾都具有add和scan方法

var Folder = function (name) {
  this.name = name;
  this.files = [];
};
Folder.prototype.add = function (file) {
  this.files.push(file);
};
Folder.prototype.scan = function () {
  console.log("開(kāi)始掃描文件夾: " + this.name);
  for (var i = 0, file, files = this.files; file = files[i++];) {
    file.scan();
  }
};
/******************************* File ******************************/
var File = function (name) {
  this.name = name;
};
File.prototype.add = function () {
  throw new Error("文件下面不能再添加文件");
};
File.prototype.scan = function () {
  console.log("開(kāi)始掃描文件: " + this.name);
};

var folder = new Folder("學(xué)習(xí)資料");
var folder1 = new Folder("JavaScript");
var folder2 = new Folder("jQuery");
var file1 = new File("JavaScript 設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐");
var file2 = new File("精通jQuery");
var file3 = new File("重構(gòu)與模式")
folder1.add(file1);
folder2.add(file2);
folder.add(folder1);
folder.add(folder2);
folder.add(file3);

var folder3 = new Folder("Nodejs");
var file4 = new File("深入淺出Node.js");
folder3.add(file4);
var file5 = new File("JavaScript 語(yǔ)言精髓與編程實(shí)踐");

folder.add(folder3);
folder.add(file5);

folder.scan();
增加刪除方法

我們需要增加一個(gè)父對(duì)象的引用

var Folder = function (name) {
  this.name = name;
  this.parent = null; //增加this.parent 屬性
  this.files = [];
};

Folder.prototype.add = function (file) {
  file.parent = this; //設(shè)置父對(duì)象
  this.files.push(file);
};

Folder.prototype.scan = function () {
  console.log("開(kāi)始掃描文件夾: " + this.name);
  for (var i = 0, file, files = this.files; file = files[i++];) {
    file.scan();
  }
};

Folder.prototype.remove = function () {
  if (!this.parent) { //根節(jié)點(diǎn)或者樹(shù)外的游離節(jié)點(diǎn)
    return;
  }
  for (var files = this.parent.files, l = files.length - 1; l >= 0; l--) {
    var file = files[l];
    if (file === this) {
      files.splice(l, 1);
    }
  }
};

var File = function (name) {
  this.name = name;
  this.parent = null;
};

File.prototype.add = function () {
  throw new Error("不能添加在文件下面");
};

File.prototype.scan = function () {
  console.log("開(kāi)始掃描文件: " + this.name);
};

File.prototype.remove = function () {
  if (!this.parent) { //根節(jié)點(diǎn)或者樹(shù)外的游離節(jié)點(diǎn)
    return;
  }

  for (var files = this.parent.files, l = files.length - 1; l >= 0; l--) {
    var file = files[l];
    if (file === this) {
      files.splice(l, 1);
    }
  }
};

var folder = new Folder("學(xué)習(xí)資料");
var folder1 = new Folder("JavaScript");
var file1 = new Folder("深入淺出Node.js");

folder1.add(new File("JavaScript 設(shè)計(jì)模式與開(kāi)發(fā)實(shí)踐"));
folder.add(folder1);
folder.add(file1);
folder1.remove(); //移除文件夾
folder.scan();

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/100716.html

相關(guān)文章

  • js組合模式和寄生組合模式的區(qū)別研究

    摘要:組合模式繼承結(jié)合了構(gòu)造函數(shù)繼承時(shí)可以為每個(gè)屬性重新初始化,構(gòu)造一個(gè)副本的優(yōu)點(diǎn),以及原型鏈繼承時(shí)一次定義處處共享的優(yōu)點(diǎn)。但令我百思不得其解的是,從上面給出的例子來(lái)看,組合繼承并沒(méi)有調(diào)用兩次超類(lèi)型構(gòu)造函數(shù)。 最近在閱讀《js權(quán)威指南》的繼承這一章,對(duì)于組合模式和寄生組合模式的區(qū)別有點(diǎn)混淆,在多次重讀以及嘗試之后,得到一些心得。 組合模式繼承 結(jié)合了構(gòu)造函數(shù)繼承時(shí)可以為每個(gè)屬性重新初始化,構(gòu)...

    tolerious 評(píng)論0 收藏0
  • js設(shè)計(jì)模式 --- 組合設(shè)計(jì)模式

    摘要:組合設(shè)計(jì)模式組合模式,將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示部分整體的層次結(jié)構(gòu),組合模式使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。 組合設(shè)計(jì)模式 組合模式,將對(duì)象組合成樹(shù)形結(jié)構(gòu)以表示部分-整體的層次結(jié)構(gòu),組合模式使得用戶(hù)對(duì)單個(gè)對(duì)象和組合對(duì)象的使用具有一致性。它使我們樹(shù)型結(jié)構(gòu)的問(wèn)題中,模糊了簡(jiǎn)單元素和復(fù)雜元素的概念,客戶(hù)程序可以像處理簡(jiǎn)單元素一樣來(lái)處理復(fù)雜元素,從而使得客戶(hù)程序與復(fù)雜元素的內(nèi)部結(jié)...

    ninefive 評(píng)論0 收藏0
  • JS對(duì)象(3)經(jīng)典對(duì)象創(chuàng)建與繼承模式

    摘要:對(duì)象經(jīng)典對(duì)象創(chuàng)建與繼承模式組合模式創(chuàng)建對(duì)象中創(chuàng)建一個(gè)對(duì)象的方式多種多樣,每種方式都有自己缺點(diǎn)或者優(yōu)點(diǎn),具體的可以參考而組合使用構(gòu)造函數(shù)模式和原型模式來(lái)創(chuàng)建自定義類(lèi)型算是最常見(jiàn)的方式了。 title: JS對(duì)象(3)經(jīng)典對(duì)象創(chuàng)建與繼承模式 date: 2016-09-28 tags: JavaScript 0x01 組合模式創(chuàng)建對(duì)象 JS 中創(chuàng)建一個(gè)對(duì)象的方式多種多樣,...

    hellowoody 評(píng)論0 收藏0
  • 組合模式

    摘要:更多前端技術(shù)和知識(shí)點(diǎn),搜索訂閱號(hào)菌訂閱組合模式在對(duì)象間形成樹(shù)形結(jié)構(gòu)組合模式中基本對(duì)象和組合對(duì)象被一致對(duì)待無(wú)須關(guān)心對(duì)象有多少層調(diào)用時(shí)只需在根部進(jìn)行調(diào)用實(shí)現(xiàn)原理創(chuàng)建宏任務(wù)并維護(hù)一個(gè)任務(wù)列表創(chuàng)建宏任務(wù)方法將到中創(chuàng)建方法循環(huán)遍歷中的對(duì)象對(duì)象必須擁有 showImg(https://segmentfault.com/img/remote/1460000019894881?w=640&h=404)...

    FreeZinG 評(píng)論0 收藏0
  • JS創(chuàng)建對(duì)象模式及其對(duì)象原型鏈探究(五):組合使用構(gòu)造函數(shù)模式和原型模式

    摘要:組合使用構(gòu)造函數(shù)模式和原型模式構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。創(chuàng)建對(duì)象組合使用構(gòu)造函數(shù)模式和原型模式指向構(gòu)造函數(shù),這里要將其恢復(fù)為指向構(gòu)造函數(shù)。另外,這種混合模式,還支持向構(gòu)造函數(shù)傳遞參數(shù)。 組合使用構(gòu)造函數(shù)模式和原型模式 構(gòu)造函數(shù)模式用于定義實(shí)例屬性,原型模式用于定義方法和共享的屬性。 創(chuàng)建自定義類(lèi)型的最常見(jiàn)方式,就是組合使用構(gòu)造函數(shù)模式和原型模式。 ...

    Shimmer 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<