zoukankan      html  css  js  c++  java
  • javascript-组合模式

    组合模式笔记

    组合模式又称部分-整体模式,将对象组合成树形结构以表示'部分整体'的层次结构

    组合模式使得用户对单个对象和组合对象的使用具有一致性

    demo实例 :表单模块

    要调用到前面学习到的寄生组合继承方法

     1             //原型式继承
     2             function inheritobject(o){
     3                 //声明一个过渡函数对象
     4                 function F(){    
     5                 }
     6                 //过渡原型对象继承父对象
     7                 F.prototype=o;
     8                 //返回过渡对象的一个实列,该实例的原型继承了父对象
     9                 return new F();
    10             }
    11             /*
    12              *寄生式继承 继承原型
    13              * 传递参数subclass 子类
    14              * 传递参数superclass 父类
    15              * */
    16             function inheritPrototype(subclass,superclass){
    17                 //复制一份父类的原型副本保存在变量中
    18                 var p=inheritobject(superclass.prototype);
    19                 //修正因为重写子类原型导致子类的constructor属性被修改
    20                 p.constructor=subclass;
    21                 //设置子类原型
    22                 subclass.prototype=p;
    23             }

    表单 demo

      1.表单虚拟父类 Base

                //表单虚拟父类 Base
                var Base = function(){
                    this.children = [];
                    this.element = null;
                };
                Base.prototype = {
                    init : function(){
                        throw new Error("请重写你的方法");
                    },
                    add : function(){
                        throw new Error("请重写你的方法");
                    },
                    getElement : function(){
                        throw new Error("请重写你的方法");
                    }
                };

      2.FormItem容器类

     1           //FormItem
     2             var FormItem = function(id,parent){
     3                 Base.call(this);
     4                 this.id = id;
     5                 this.parent = parent;
     6                 this.init();
     7             };
     8             inheritPrototype(FormItem,Base);
     9             FormItem.prototype = { 
    10                 init : function(){
    11                    this.element =document.createElement('form');
    12                    this.element.id=this.id;
    13                    this.element.className='new-form';
    14                 },
    15                 add : function(child){
    16                    this.children.push(child);
    17                    this.element.appendChild(child.getElement());
    18                    return this;
    19                 },
    20                 getElement : function(){
    21                    return this.element;
    22                 },
    23                 show : function(){
    24                    this.parent.appendChild(this.element);
    25                 }
    26             };

     3.FieldsetItem类

     1             //FieldsetItem
     2             var FieldsetItem = function(classname,legend){
     3                 Base.call(this);
     4                 this.classname=classname || '';
     5                 this.legend=legend;
     6                 this.init();
     7             };
     8             inheritPrototype(FieldsetItem,Base);
     9             FieldsetItem.prototype = {
    10                 init : function(){
    11                     this.element = document.createElement('fieldset');
    12                     var legendname = document.createElement('legend');
    13                     legendname.innerHTML = this.legend;
    14                     this.element.appendChild(legendname);
    15                     this.element.className='new-fieldset';
    16                 },
    17                 add : function(child){
    18                     this.children.push(child);
    19                     this.element.appendChild(child.getElement());
    20                     return this;
    21                 },
    22                 getElement : function(){
    23                     return this.element;
    24                 },
    25             };

      4.Group类

     1            var Group = function(){
     2                 Base.call(this);
     3                 this.init();
     4             };
     5             inheritPrototype(Group,Base);
     6             Group.prototype = {
     7                 init : function(){
     8                     this.element = document.createElement('div');
     9                     this.element.className='group';
    10                 },
    11                 add : function(child){
    12                     this.children.push(child);
    13                     this.element.appendChild(child.getElement());
    14                     return this;
    15                 },
    16                 getElement : function(){
    17                     return this.element;
    18                 }
    19             };

     5.InputItem

     1             //InputItem
     2             var InputItem = function(name){
     3                 Base.call(this);
     4                 this.classname = name;
     5                 this.id = name;
     6                 this.init();
     7             };
     8             inheritPrototype(InputItem,Base);
     9             InputItem.prototype = {
    10                 init : function(){
    11                     this.element = document.createElement('input');
    12                     this.element.className=this.classname;
    13                     this.element.id=this.id;
    14                 },
    15                 add : function(){
    16                    
    17                 },
    18                 getElement : function(){
    19                     return this.element;
    20                 }
    21             };

     6.LabelItem类

     1             //LabelItem
     2             var LabelItem = function(name,nameText){
     3                 Base.call(this);
     4                 this.text = nameText;
     5                 this.name = name;
     6                 this.init();
     7             };
     8             inheritPrototype(LabelItem,Base);
     9             LabelItem.prototype = {
    10                 init : function(){
    11                     this.element = document.createElement('label');
    12                     this.element.name=this.name;
    13                     this.element.innerHTML=this.text;
    14                 },
    15                 add : function(){
    16                    
    17                 },
    18                 getElement : function(){
    19                     return this.element;
    20                 }
    21             };

     7.SpanItem类

     1             //SpanItem
     2             var SpanItem = function(warntext){
     3                 Base.call(this);
     4                 this.text = warntext;
     5                 this.init();
     6             };
     7             inheritPrototype(SpanItem,Base);
     8             SpanItem.prototype = {
     9                 init : function(){
    10                     this.element = document.createElement('span');
    11                     this.element.innerHTML=this.text;
    12                 },
    13                 add : function(){
    14                    
    15                 },
    16                 getElement : function(){
    17                     return this.element;
    18                 }
    19             };

    测试代码

     1             var form =new FormItem('FormItem',document.body);
     2             form.add(
     3                 new FieldsetItem('account','账号').add(
     4                     new Group().add(
     5                         new LabelItem('uname','用户名:')
     6                     ).add(
     7                         new InputItem('uname')
     8                     ).add(
     9                         new SpanItem('4到6位数字或字母')
    10                     )
    11                 ).add(
    12                     new Group().add(
    13                         new LabelItem('pwd','密&nbsp码:')
    14                     ).add(
    15                         new InputItem('pwd')
    16                     ).add(
    17                         new SpanItem('6到12位数字或字母')
    18                     )
    19                 )
    20             ).add(
    21                 new FieldsetItem('info','信息').add(
    22                     new Group().add(
    23                         new LabelItem('name','昵称:')
    24                     ).add(new InputItem('name'))
    25                 ).add(
    26                     new Group().add(
    27                         new LabelItem('status','状态:')
    28                     ).add(
    29                         new InputItem('status')
    30                     )
    31                 )
    32             ).show();

    浏览器显示

    生成的html代码

  • 相关阅读:
    A1066 Root of AVL Tree (25 分)
    A1099 Build A Binary Search Tree (30 分)
    A1043 Is It a Binary Search Tree (25 分) ——PA, 24/25, 先记录思路
    A1079; A1090; A1004:一般树遍历
    A1053 Path of Equal Weight (30 分)
    A1086 Tree Traversals Again (25 分)
    A1020 Tree Traversals (25 分)
    A1091 Acute Stroke (30 分)
    A1103 Integer Factorization (30 分)
    A1032 Sharing (25 分)
  • 原文地址:https://www.cnblogs.com/jtnote/p/5995859.html
Copyright © 2011-2022 走看看