Jadual Kandungan
特点
设计
使用
Rumah hujung hadapan web tutorial js js组合设计模式详解

js组合设计模式详解

Feb 23, 2018 pm 02:06 PM
javascript gabungan corak reka bentuk

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性。

它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。它可以帮助开发者对多个具有相似功能对象进行分类, 提高规范化设计

有许多关于分级数据结构的例子,使得组合模式非常有用武之地。关于分级数据结构的一个普遍性的例子是你每次使用电脑时所遇到的:文件系统。文件系统由目录和文件组成。每个目录都可以装内容。目录的内容可以是文件,也可以是目录。按照这种方式,计算机的文件系统就是以递归结构来组织的。如果你想要描述这样的数据结构,那么你可以使用组合模式Composite。
涉及角色

特点

在组合模式的层次体系中有两种类型的对象: 叶对象和组合对象, 这是一种递归定义, 但者也是其有用的原因所在, 一个组合对象可以由其他组合对象和叶子对象组成, 但叶子对象不再包含子对象, 组合对象用于叶子节点的分类
js组合设计模式详解

设计

这里借用 javascript设计模式 的图来说明组合模式的设计

  • Interface 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。

  • Field 在组合中表示叶子结点对象,叶子结点没有子结点, 可以设计成抽象类, 通过继承设计出不同类别的叶子对象.

  • Composite 定义有子节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
    js组合设计模式详解

  • 接口

    /* Interfaces. */
    
    var Composite = new Interface('Composite', ['add', 'remove', 'getChild']);
    var FormItem = new Interface('FormItem', ['save']);
    Salin selepas log masuk
  • 组合对象类

    /* CompositeForm class. */
    
    var CompositeForm = function(id, method, action) { // implements Composite, FormItem
      this.formComponents = [];
    
      this.element = document.createElement('form');
      this.element.id = id;
      this.element.method = method || 'POST';
      this.element.action = action || '#';
    };
    
    CompositeForm.prototype.add = function(child) {
      Interface.ensureImplements(child, Composite, FormItem);
      this.formComponents.push(child);
      this.element.appendChild(child.getElement());
    };
    
    CompositeForm.prototype.remove = function(child) {
      for(var i = 0, len = this.formComponents.length; i < len; i++) {
        if(this.formComponents[i] === child) {
          this.formComponents.splice(i, 1); // Remove one element from the array at 
                                            // position i.
          break;
        }
      }
    };
    
    CompositeForm.prototype.getChild = function(i) {
      return this.formComponents[i];
    };
    
    CompositeForm.prototype.save = function() {
      for(var i = 0, len = this.formComponents.length; i < len; i++) {
        this.formComponents[i].save();
      }
    };
    
    CompositeForm.prototype.getElement = function() { 
      return this.element; 
    };
    Salin selepas log masuk
  • 叶子对象类
    叶子对象可以是简单的一个类, 也可以设计成抽象类构建不同类别的叶子, 在此采用抽象类设计不同类别的叶子

    /* Field class, abstract. */
    
    var Field = function(id) { // implements Composite, FormItem
      this.id = id;
      this.element;
    };
    
    Field.prototype.add = function() {};
    Field.prototype.remove = function() {};
    Field.prototype.getChild = function() {};
    
    Field.prototype.save = function() {
      setCookie(this.id, this.getValue);
    };
    
    Field.prototype.getElement = function() { 
      return this.element; 
    };
    
    Field.prototype.getValue = function() { 
      throw new Error('Unsupported operation on the class Field.'); 
    };
    Salin selepas log masuk
  • InputField 类

    /* InputField class. */
    
    var InputField = function(id, label) { // implements Composite, FormItem
      Field.call(this, id);
    
      this.input = document.createElement('input');
      this.input.id = id;
    
      this.label = document.createElement('label');
      var labelTextNode = document.createTextNode(label);
      this.label.appendChild(labelTextNode);
    
      this.element = document.createElement('p');
      this.element.className = 'input-field';
      this.element.appendChild(this.label);
      this.element.appendChild(this.input);
    };
    extend(InputField, Field); // Inherit from Field.
    
    InputField.prototype.getValue = function() { 
      return this.input.value;
    };
    Salin selepas log masuk
  • TextareaField 类

    /* TextareaField class. */
    
    var TextareaField = function(id, label) { // implements Composite, FormItem
      Field.call(this, id);
    
      this.textarea = document.createElement('textarea');
      this.textarea.id = id;
    
      this.label = document.createElement('label');
      var labelTextNode = document.createTextNode(label);
      this.label.appendChild(labelTextNode);
    
      this.element = document.createElement('p');
      this.element.className = 'input-field';
      this.element.appendChild(this.label);
      this.element.appendChild(this.textarea);
    };
    extend(TextareaField, Field); // Inherit from Field.
    
    TextareaField.prototype.getValue = function() { 
      return this.textarea.value;
    };
    Salin selepas log masuk
  • SelectField 类

    /* SelectField class. */
    
    var SelectField = function(id, label) { // implements Composite, FormItem
      Field.call(this, id);
    
      this.select = document.createElement('select');
      this.select.id = id;
    
      this.label = document.createElement('label');
      var labelTextNode = document.createTextNode(label);
      this.label.appendChild(labelTextNode);
    
      this.element = document.createElement('p');
      this.element.className = 'input-field';
      this.element.appendChild(this.label);
      this.element.appendChild(this.select);
    };
    extend(SelectField, Field); // Inherit from Field.
    
    SelectField.prototype.getValue = function() {
      return this.select.options[this.select.selectedIndex].value;
    };
    Salin selepas log masuk

使用

/* Usage. */

var contactForm = new CompositeForm('contact-form', 'POST', 'contact.php');

contactForm.add(new InputField('first-name', 'First Name'));
contactForm.add(new InputField('last-name', 'Last Name'));
contactForm.add(new InputField('address', 'Address'));
contactForm.add(new InputField('city', 'City'));
contactForm.add(new SelectField('state', 'State', stateArray)); 
// var stateArray =[{'al', 'Alabama'}, ...]
contactForm.add(new InputField('zip', 'Zip'));
contactForm.add(new TextareaField('comments', 'Comments'));

addEvent(window, 'unload', contactForm.save);
Salin selepas log masuk
组合模式适合对大批对象进行操作, 且操作对象具有层次关系, 通过对对象的分类操作籍此弱化对象之间的耦合, 这种模式使得代码模块化程度更高, 层次更鲜明, 维护性较好

相关推荐:

js桥接设计模式详解

Node.js中通用基础设计模式实例分析

js代理设计模式详解

Atas ialah kandungan terperinci js组合设计模式详解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Perbezaan antara corak reka bentuk dan corak seni bina dalam rangka kerja Java Perbezaan antara corak reka bentuk dan corak seni bina dalam rangka kerja Java Jun 02, 2024 pm 12:59 PM

Dalam rangka kerja Java, perbezaan antara corak reka bentuk dan corak seni bina ialah corak reka bentuk mentakrifkan penyelesaian abstrak kepada masalah biasa dalam reka bentuk perisian, memfokuskan pada interaksi antara kelas dan objek, seperti corak kilang. Corak seni bina mentakrifkan hubungan antara struktur sistem dan modul, memfokuskan pada organisasi dan interaksi komponen sistem, seperti seni bina berlapis.

Analisis Corak Penghias dalam Corak Reka Bentuk Java Analisis Corak Penghias dalam Corak Reka Bentuk Java May 09, 2024 pm 03:12 PM

Corak penghias ialah corak reka bentuk struktur yang membolehkan penambahan dinamik fungsi objek tanpa mengubahsuai kelas asal. Ia dilaksanakan melalui kerjasama komponen abstrak, komponen konkrit, penghias abstrak dan penghias konkrit, dan boleh mengembangkan fungsi kelas secara fleksibel untuk memenuhi keperluan yang berubah-ubah. Dalam contoh ini, penghias susu dan mocha ditambahkan pada Espresso untuk jumlah harga $2.29, menunjukkan kuasa corak penghias dalam mengubah suai gelagat objek secara dinamik.

Analisis kes praktikal corak reka bentuk PHP Analisis kes praktikal corak reka bentuk PHP May 08, 2024 am 08:09 AM

1. Corak kilang: Asingkan penciptaan objek dan logik perniagaan, dan cipta objek jenis tertentu melalui kelas kilang. 2. Corak pemerhati: membenarkan objek subjek memberitahu objek pemerhati tentang perubahan keadaan mereka, mencapai gandingan longgar dan corak pemerhati.

Bagaimana corak reka bentuk menangani cabaran penyelenggaraan kod Bagaimana corak reka bentuk menangani cabaran penyelenggaraan kod May 09, 2024 pm 12:45 PM

Corak reka bentuk menyelesaikan cabaran penyelenggaraan kod dengan menyediakan penyelesaian yang boleh digunakan semula dan boleh diperluas: Corak Pemerhati: Membenarkan objek melanggan acara dan menerima pemberitahuan apabila ia berlaku. Corak Kilang: Menyediakan cara terpusat untuk mencipta objek tanpa bergantung pada kelas konkrit. Corak Singleton: memastikan bahawa kelas hanya mempunyai satu contoh, yang digunakan untuk mencipta objek yang boleh diakses secara global.

Penggunaan indah corak penyesuai dalam corak reka bentuk Java Penggunaan indah corak penyesuai dalam corak reka bentuk Java May 09, 2024 pm 12:54 PM

Corak Penyesuai ialah corak reka bentuk struktur yang membolehkan objek yang tidak serasi berfungsi bersama Ia menukar satu antara muka kepada yang lain supaya objek boleh berinteraksi dengan lancar. Penyesuai objek melaksanakan corak penyesuai dengan mencipta objek penyesuai yang mengandungi objek yang disesuaikan dan melaksanakan antara muka sasaran. Dalam kes praktikal, melalui mod penyesuai, pelanggan (seperti MediaPlayer) boleh memainkan media format lanjutan (seperti VLC), walaupun ia sendiri hanya menyokong format media biasa (seperti MP3).

Corak Reka Bentuk PHP: Pembangunan Dipacu Ujian dalam Amalan Corak Reka Bentuk PHP: Pembangunan Dipacu Ujian dalam Amalan Jun 03, 2024 pm 02:14 PM

TDD digunakan untuk menulis kod PHP berkualiti tinggi Langkah-langkahnya termasuk: menulis kes ujian, menerangkan fungsi yang diharapkan dan menjadikannya gagal. Tulis kod supaya hanya kes ujian lulus tanpa pengoptimuman yang berlebihan atau reka bentuk terperinci. Selepas kes ujian lulus, optimumkan dan faktorkan semula kod untuk meningkatkan kebolehbacaan, kebolehselenggaraan dan kebolehskalaan.

Aplikasi corak reka bentuk dalam rangka kerja Guice Aplikasi corak reka bentuk dalam rangka kerja Guice Jun 02, 2024 pm 10:49 PM

Rangka kerja Guice menggunakan beberapa corak reka bentuk, termasuk: Corak Singleton: memastikan kelas hanya mempunyai satu tika melalui anotasi @Singleton. Corak kaedah kilang: Cipta kaedah kilang melalui anotasi @Provides dan dapatkan contoh objek semasa suntikan pergantungan. Mod strategi: Bungkus algoritma ke dalam kelas strategi yang berbeza dan nyatakan strategi khusus melalui anotasi @Named.

Apakah kelebihan dan kekurangan menggunakan corak reka bentuk dalam rangka kerja java? Apakah kelebihan dan kekurangan menggunakan corak reka bentuk dalam rangka kerja java? Jun 01, 2024 pm 02:13 PM

Kelebihan menggunakan corak reka bentuk dalam rangka kerja Java termasuk: kebolehbacaan kod yang dipertingkatkan, kebolehselenggaraan dan kebolehskalaan. Kelemahan termasuk kerumitan, overhed prestasi dan keluk pembelajaran yang curam akibat penggunaan berlebihan. Kes praktikal: Mod proksi digunakan untuk malas memuatkan objek. Gunakan corak reka bentuk dengan bijak untuk memanfaatkan kelebihannya dan meminimumkan kelemahannya.

See all articles