单元测试与设计模式(4)
前言
按照前几日一样,继续学习-0-
正文
设计模式:
/**
* [State]
* 状态模式,当一个对象内部状态发生改变时,会导致其行为的改变,这看起来像是改变了对象
*/
State:function(num){
var States = function(){
var result;
var State = {
state0 : function(){
result = "state0";
},
state1:function(){
result = "state01";
},
state2:function(){
result = "state2";
}
}
//获取某一种状态并执行其对应的方法
function show(test){
State['state' + test] && State['state' + test]();
return result;
}
return {
//返回调用状态方法接口
show : show,
}
}();
return States.show(num);
},
/**
* [Strategy]
* 策略模式,将定义的一组算法封装起来,使其互相之间可以替换。封装的算法有一定独立性,不会随客户端变化而变化
*/
Strategy:function(num){
var PriceStrategy = function(){
var strategy = {
return30 : function(price){
return + price + parseInt(price / 100) * 30;
},
return50 : function(price){
return + price + parseInt(price / 100) * 50;
},
return50 : function(price){
return + price + parseInt(price / 100) * 50;
},
percent50 : function(price){
return price * 100 * 50 / 10000;
}
}
return function(algorithm,price){
return strategy[algorithm] && strategy[algorithm](price);
/**扩展算法
addStrategy : function(type,fn){
strategy[type] = fn;
}
PriceStrategy.addStrategy('xx',function(value){
return "xxx";
});
*/
}
}();
var price = PriceStrategy('return50',num);
return price.toString();
},
单元测试:
it('对状态模式正向测试,返回值应该是state2', function() {
var defaultData = myComponent;
defaultData.methods.State("2").should.be.eql("state2");
});
it('对策略模式正向测试,返回值应该是state2', function() {
var defaultData = myComponent;
defaultData.methods.Strategy("314.67").should.be.eql("464.67");
});