javascript设计模式(三) 命令模式 享元模式

命令模式的主要用途是让命令的接收者和命令发送者消除耦合,命令的意思是指执行某些行为的指令,他的应用场景应该是:有时候想发送一个请求给另一个对象,但是并不知道这个对象是什么,也不知道这个命令的具体内容。或者换另一种说法就是想要封装一系列触发行为和执行行为的代码,在将两者间的耦合降低的同时,也将代码不变的部分和改变的部分分离出来,形成良好的遵从开放封闭原则的代码。下面来看一个例子。

<span style="font-size:18px;">var setCommand = function( button, command ){//将命令对象和命令请求联系起来
    button.onclick = function(){
        command.execute();
    };
};

var MenuBar = {//请求内容
    refresh: function(){
        console.log( '刷新菜单列表' );
    }
};

var RefreshMenuBarCommand = function( receiver ){//命令对象构造函数,引入并保存具体命令内容
    return {
        execute: function(){
            receiver.refresh();
        }
    };
};

var RefreshMenuBarCommand = RefreshMenuBarCommand( MenuBar );//真正的命令对象

setCommand( button1, RefreshMenuBarCommand );</span>
命令对象首先将命令的接收方也就是执行方封装起来,并暴露出一个统一的execute命令调用接口,最后根据实际情况决定命令请求者如何使用命令对象。根据请求者的行为对命令对象进行合适的调用,其实就是回调函数的一个变种,请求发送后合适的时候进行回调函数执行命令。最后一句话概括一下:命令对象封装命令内容提供接口供请求者调用。


享元(flyweight)模式是一种用于性能优化的模式,fly是苍蝇的意思,代表着蝇量级,其模式的核心为用共享技术来有效支持大量细粒度的对象,通俗说就是如果程序中有大量类似的对象就可以使用享元模式来对这些对象进行重构复用来节省内存。观察下面两组代码,实现了模特试穿100件衣服场景


创建了100个模特分别进行50件衣服的试穿

<span style="font-size:18px;">var Model = function( sex, underwear ){
    this.sex = sex;
    this.underwear = underwear;
};

Model.prototype.takePhoto = function(){
    console.log( 'sex=' + this.sex + 'underwear=' +this.underwear );
};

for( var i = 1; i <= 50; i++ ){
    var maleModel = new Model( 'male', 'underwear' + i);
    male.takePhoto();
}

for( var i = 1; i <= 50; i++ ){
    var femaleModel = new Model( 'female', 'underwear' + i);
    female.takePhoto();
}
</span>


一个简单的类似享元模式的范例,创建了二个模特进行50件衣服试穿

<span style="font-size:18px;">var Model = function( sex ){
    this.sex = sex;
};

Model.prototype.takePhoto = function(){
    console.log( 'sex=' + this.sex + 'underwear=' + this.underwear );
};

var maleModel = new Model( 'male' ),
    femaleModel = new Model( 'female' );

for( var i = 1; i<50; i++ ){
    maleModel.underwear = 'underwear' + i;
    maleModel.takePhoto();
}

for( var j = 1; i<=50; j++ ){
    femaleModel.underwear = 'underwear' + j;
    femaleModel.takePhoto();
}
</span>
很显然的,后者要远远优化于前者,即使后者多了一些代码量,但他只创建了一个对象,而前者创建了50个对象,现在分析一下后者优化的过程,后者的关键的一步并不是没有创建50个对象,而是在一开始他就将sex属性固定,而将underwear属性修改成动态赋值的,因为前者的50个对象中,其实都有一个一样的属性就是sex,而变化的属性只有underear,所以如果把不变的属性提取出来固定写死,而underwear属性动态变化,也是可以实现同样功能的。我们把不变共享的属性叫做内部状态,而变化的属性叫做外部状态。

享元模式的目标的是尽量减少对象的数量,这是一种用时间换空间的优化方法,大多是通过利用对象外部状态改变的的时间来换取对象空间的存储优化,它要求将对象的属性分为内部状态和外部状态,把所有内部状态相同的对象指定为同一个共享的对象,外部状态则从对象身上剥离储存在外部,这里给出了一些区分的经验:

1.内部状态存储于对象内部

2.内部状态可以被一些对象共享

3.内部状态都路与具体的场景,通常不会改变

4.外部状态取决于具体的场景,并根据场景而变化,外部状态不能被共享。

当然何时如何使用仍要根据具体的情况来进行判断决定,不要盲目的用时间来换取空间。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值