甘露模型的装饰模式实现

这是我第二次针对甘露模型做专题了。这一次是基于最新版本的甘露模型做设计模式的探讨实现。

开篇之前,先说几句废话:

javascript运行于浏览器之上,而设计模式一般是在大型项目中才有用武之地,这二者一结合,也便产生了一个中心,两个基本点。

所谓 一个中心:稳定运行,性能至上。

浏览器上面运行的程序,想要做大一点的项目,首先是要过性能这一关。而甘露模型实现了完美的内存资源节约和性能优化,是架构核心的不二之选。

所谓 两个基本点:1,架构清晰; 2,易于扩展;

基于甘露模型本身的面向对象思想,完全可以用来实现GOF23,所以,在架构和扩展上既然有了设计模式做铺垫,也就不必担心什么大问题了。

代码的例子描述来自 terrylee 的装饰模式C#版本, http://terrylee.cnblogs.com/archive/2006/03/01/340592.html

关于装饰模式的详细解释,请看 terrylee 的装饰模式C#版本,这里我就不多详解了。

废话完毕,直接上代码:

//============甘露模型开始 =================================

    //定义类的语法甘露:Class()
    //最后一个参数是JSON表示的类定义
    //如果参数数量大于1个,则第一个参数是基类
    //第一个和最后一个之间参数,将来可表示类实现的接口
    //返回值是类,类是一个构造函数
    function Class() {
      var aDefine = arguments[arguments.length - 1]; //最后一个参数是类定义
      if (!aDefine) return;
      var aBase = arguments.length > 1 ? arguments[0] : object; //解析基类
      function prototype_() { }; //构造prototype的临时函数,用于挂接原型链
      prototype_.prototype = aBase.prototype; //准备传递prototype
      var aPrototype = new prototype_();  //建立类要用的prototype
      for (var member in aDefine) //复制类定义到当前类的prototype
        if (member != "Create")  //构造函数不用复制
        aPrototype[member] = aDefine[member];
      //根据是否继承特殊属性和性能情况,可分别注释掉下列的语句
      if (aDefine.toString != Object.prototype.toString)
        aPrototype.toString = aDefine.toString;
      if (aDefine.toLocaleString != Object.prototype.toLocaleString)
        aPrototype.toLocaleString = aDefine.toLocaleString;
      if (aDefine.valueOf != Object.prototype.valueOf)
        aPrototype.valueOf = aDefine.valueOf;
      if (aDefine.Create) //若有构造函数
        var aType = aDefine.Create //类型即为该构造函数
      else  //否则为默认构造函数
        aType = function() {
          this.base.apply(this, arguments);  //调用基类构造函数
        };
      aType.prototype = aPrototype;  //设置类(构造函数)的prototype
      aType.Base = aBase;       //设置类型关系,便于追溯继承关系
      aType.prototype.Type = aType;  //为本类对象扩展一个Type属性
      return aType;  //返回构造函数作为类
    };
    //根类object定义:
    function object() { }  //定义小写的object根类,用于实现最基础的方法等
    object.prototype.isA = function(aType)  //判断对象是否属于某类型
    {
      var self = this.Type;
      while (self) {
        if (self == aType) return true;
        self = self.Base;
      };
      return false;
    };
    object.prototype.base = function() //调用基类构造函数
    {
      var Base = this.Type.Base; //获取当前对象的基类 
      if (!Base.Base) //若基类已没有基类
        Base.apply(this, arguments)   //则直接调用基类构造函数
      else  //若基类还有基类    
      {
        this.base = MakeBase(Base);   //先覆写this.base
        Base.apply(this, arguments);  //再调用基类构造函数
        delete this.base;        //删除覆写的base属性
      };
      function MakeBase(Type) //包装基类构造函数
      {
        var Base = Type.Base;
        if (!Base.Base) return Base; //基类已无基类,就无需包装
        return function()  //包装为引用临时变量Base的闭包函数
        {
          this.base = MakeBase(Base);   //先覆写this.base
          Base.apply(this, arguments);  //再调用基类构造函数
        };
      };
    };

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索函数
, function
, this
, prototype
, 径向基函数
, base
arguments
甘露模型、3d装饰画模型、中国传统装饰柱 模型、r语言 garch模型实现、基本模型机设计与实现,以便于您获取更多的相关知识。

时间: 2024-12-17 04:06:46

甘露模型的装饰模式实现的相关文章

参悟JavaScript

引子     编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力.     数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个世界.    你看,数据代码间的关系与物质能量间的关系有着惊人的相似.数据也是有惯性的,如果没有代码来施加外力,她总保持自己原来的状态.而代码就象能量,他存在的唯一目的,就是要努力改变数据原来的状态.在代码改变数据的同时,也会因为数据的抗拒而反过来影响或改变代码原有的趋势.甚至在某些

李战:悟透JavaScript

多年前,曾经看过李战大师的"悟透delphi-delphi的原子世界",一直对大师特有的文笔风格记忆犹新,今天无意又看到了大师的"李战:悟透JavaScript",转贴于此,与众分享!   引子    编程世界里只存在两种基本元素,一个是数据,一个是代码.编程世界就是在数据和代码千丝万缕的纠缠中呈现出无限的生机和活力.     数据天生就是文静的,总想保持自己固有的本色:而代码却天生活泼,总想改变这个世界.    你看,数据代码间的关系与物质能量间的关系有着惊人的相

javascript prototype 原型链_prototype

JavaScript中的prototype概念恰如其分地反映了这个词的内含,我们不能将其理解为C++的prototype那种预先声明的概念. JavaScript 的所有function类型的对象都有一个prototype属性.这个prototype属性本身又是一个object类型的对象,因此我们也可以给这个prototype对象添加任意的属性和方法.既然prototype是对象的"原型",那么由该函数构造出来的对象应该都会具有这个"原型"的特性.事实上,在构造函数

JavaScript 面向对象编程(2) 定义类_js面向对象

本文承接上一篇JavaScript面向对象编程(1) 基础. 上篇说过,JavaScript没有类的概念,需要通过函数来实现类的定义.先通过一个例子说明: 复制代码 代码如下: function myClass() { var id = 1; var name = "johnson"; //properties this.ID = id; this.Name = name; //method this.showMessage = function() { alert("ID:

Java 23种设计模型详解_java

设计模式(Design Patterns)                                   --可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样.项目中合理的运用设计模式可以完美的解决很多问题,每

IOCP模型与网络编程

IOCP模型与网络编程 一.前言:        在老师分配任务("尝试利用IOCP模型写出服务端和客户端的代码")给我时,脑子一片空白,并不知道什么是IOCP模型,会不会是像软件设计模式里面的工厂模式,装饰模式之类的那些呢?嘿嘿,不过好像是一个挺好玩的东西,挺好奇是什么东西来的,又是一个新知识啦~于是,开始去寻找一大堆的资料,为这个了解做准备,只是呢,有时还是想去找一本书去系统地学习一下,毕竟网络的资料还是有点零散.话说,本人学习这个模型的基础是,写过一个简单的Socket服务器及客

C++ 设计模式 装饰模式(Decorator Pattern)

C++ 设计模式 装饰模式 在结构型模式中装饰模式给我留下了深刻的印象,其中也感觉到在设计模式中基本都是 依赖C++的多态来实现,装饰模式也不例外,他允许在不改变原有类的代码的基础上, 不通过直接继承原有类的代码通过一个抽象接口层进行实现,甚至可以随意的组合, 所以这里记录之以备使用 下面是模型图: 下面是一个简单的模拟代码,模拟本来一个工具只有写功能,但是我们要不断的扩充其 功能让它有听有读的功能: 这是跑出来的结果 ----source tool---- i can write!! ----

lda 文本挖掘-现在想用LDA主题模型分析文本内容,LDA主题模型怎么阅读每个topic下面的词汇

问题描述 现在想用LDA主题模型分析文本内容,LDA主题模型怎么阅读每个topic下面的词汇 现在想用LDA主题模型分析文本内容,LDA主题模型怎么阅读每个topic下面的词汇,每个主题会有一个概率值吗.

PAI分布式机器学习平台编程模型演进之路

什么是PAI? PAI的全称是Platform of Artificial Intelligence,主要在使用机器学习做模型训练时提供整套链路.机器学习即服务,把机器学习作为服务对外推出,大家可以在平台上使用比较先进的机器学习算法.将多种深度学习框架集成到PAI中,同时基于深度学习框架包装成更加易用的组件.具备异构的计算服务能力,把CPU计算能力和GPU计算能力统一调度起来,异构的计算能力透明,大家的注意力是哪些机器学习算法可以帮助业务,不用关心底层资源的申请和分配.PAI也支持在线预测服务,