《JS设计模式》读书笔记(二)

标签:JS 设计模式


读书笔记链接:


策略模式

封装一系列的算法,并且各个可以替换;不只算法,规则架构也可以作为策略来封装。

使用场景:一个旅游类,接受各种出行策略类。
travel.setVehicle(new Car()) // new Bus(), new Plane();

事实上,在js中策略模式被广泛使用,例如事件的回调; 原因就在于JS中的函数可以当做变量来传递

结果:消除大片的条件分支语句(switch)

var tween = {
    linear: function(t,b,c,d) { return b + c*t/d },
    easeIn: function(t,b,c,d) { return b + c * (t/d) * (t/d)},
    easeOut: function(t,b,c,d) {return b + c * ((t/d -1) * (t/d -1) +1)}
}

var Animation = function(el) {
    this.el = el;
    this.startTime = 0;
    this.start = 0;
    this.end = 0;
    this.prop = '';
    this.easing = null; // 这里使用策略模式
    this.duration = 0;
}
Animation.prototype.run = function(prop, end, duration, easing) {
    this.startTime = Date.now();
    this.start = this.el.getBoundingClientRect()[prop]; // 针对位置大小
    this.duration = duration;
    this.easing = tween[easing];
    var that = this;
    var timeId = setInterval(function(){
        if(that.step() === false) clearInterval(timeId)
    }, 20);
}
Animation.prototype.step = function() {
    var elapse = Date.now() - this.startTime;
    if(elapse >= this.duration) {
        this.update(this.end)
        return false;
    }
    var pos = this.easing(elapse, this.start, this.end-this.start, this.duration);
    this.update(pos)
}
Animation.prototype.update = function(pos) {
    this.el.style[this.prop] = pos + 'px';
}

var div = document.getElementById('div');
var anim = new Animation(div);
anim.start('right', 500, 1000, 'easeOut');

代理模式

通过引入一个新的层,在不改动原有类的情况下为原有的类增加新功能,解耦。

使用场景:虚拟代理,汇总任务,例如HTTP请求;缓存代理,缓存结果;

结果:提高类的内聚性,新功能放在类的外面,以后不需要时也不用修改原类

注意:代理类与原类的API要保持一致,外部调用不能也不应该知道调用的是代理类还是原类

var cachedFn = function(fn) {
    var cache = {};
    return function() {
        var args = []
        for(var i=0,l=arguments.length;i<l;i++){
            args.push(arguments[i])
        }
        if(cache[args.toString()]) return cache[args.toString()];
        return cache[args.toString()] = fn.apply(this, args)

    }
}

function fatorial(num) {
    if(num === 0) return 1;
    var result = num;
    for(var i=1,l=num;i<l;i++){
        result = result * i;
    }
    return result;
}

var cachedFactorial = cachedFn(fatorial);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,977评论 25 708
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,826评论 2 17
  • 如果你战胜了孩子这6个问题,孩子将爆发出非常强的学习洪荒之力—— ①学习有什么意义? 读书是没有什么意义的,有时候...
    牛小丫53阅读 247评论 2 4
  • yaml概述 yaml容易被机器解析,且人类可读。 这是一个谎言吧! 利用冒号分隔键和值,用中划线表示数组。这就是...
    王强儿阅读 12,925评论 0 4
  • 我用整夜的时间读你 爱清晰了 痛深刻起来 一个春天一次偶然相遇 一朵蓓蕾绽放 听得见朝圣者的歌唱 那是献给上帝的赞...
    蔚霐阅读 317评论 2 5