再一次,javascript设计模式与开发实践-开放-封闭原则

定义

很多时候,一个程序具有良好的设计,它通常是符合开发-封闭原则的。

软件实体(类、模块、函数)等应该是可以扩展的,但是不可修改的。

例子

过多的if是造成违反开发-封闭原则的一个常见原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var markSound = function (animal) {
    if (animal instanceof Duck) {
        console.log('嘎嘎嘎');
    }
    else if (animal instanceof Chicken) {
        console.log('咯咯咯');
    }
};

var Duck    = function () {};
var Chicken = function () {};

markSound(Duck());
markSound(Chicken());

显然如果动物世界再增加一只狗之后,我们必须改写markSound函数。

阅读全文

再一次,javascript设计模式与开发实践-最少知识原则

定义

某军队中的将军需要挖掘一些散兵坑,下面是完成任务的一种方式:

将军通知上校,上校通知上尉,上尉通知军士,最后军士叫来士兵,让士兵来挖一些散兵坑。

将军根本不必考虑挖散兵坑的细节信息,只要通知下属就好了,

减少对象之间的联系

在程序中,对象的“朋友”多并不是一件好事,“城门失火,殃及池鱼”和“一人犯法,株连九族”的事情时有发生..
最少知识原则要求我们在设计程序时,应当尽可能的减少对象之间的交互,如果两个对象之间不必彼此直接通信,那么这两个对象就不要发生直接的相互联系。
常见的做法是引入一个第三者对象来承担这些对象之间的通信。

阅读全文

再一次,javascript设计模式与开发实践-单一职责原则

定义

如果我们有两个动机去改写一个方法,那么这个方法就具有两个职责。
每个职责都是变化的一个轴线,如果一个方法承担了过多的职责,那么在需求变化的过程中,需要改写这个方法的可能性就越大。
因此,单一职责(SRP)原则体现为:一个对象(方法)只做一件事。

例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var createLayer = (function () {
    var div;

    return function () {
        if(!div) {
            div = document.createElement('div');
            div.innerHTML = '我是浮动窗';
            document.body.appendChild(div);
        }

        return div;
    };
})();

var layer1 = createLayer();
var layer2 = createLayer();

console.log(layer1 === layer2); // true

上面的代码把生成单例和创建悬浮窗的职责合在了一起,这个两个方法可以独立变化而不相互影响,那么遵守单一职责应该这样写。

阅读全文

再一次,javascript设计模式与开发实践-适配器模式

简述

使接口保持一致

在火车站、机场有临时的手机充电处,那里的数据线比较特别,一头有供各种手机用的接头,另一头是标准的USB接口,这种属于适配器模式。

使用场景

  • 多个不同的数据接口
  • ..

案例

渲染地图的API来自不同的提供,那么使用适配器模式来使API保持一致。

阅读全文

再一次,javascript设计模式与开发实践-状态模式

简述

允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。

酒店的台灯开关顺序通常是:关灯 → 弱等 → 强灯 → 关灯,这这种行为就是状态。

使用场景

  • 文件状态
  • 角色动作
  • ..

案例

如上台灯的状态行为,用多层if可以很快的编写代码,但假如新设计的台灯又多了一种状态呢?
随着情况越来越多,显然if的方式会违反开发-封闭原则,后续维护将变得复杂。
状态模式能够很好的解决这种问题。

阅读全文

再一次,javascript设计模式与开发实践-装饰者模式

简述

在不改变对象自身的基础上,在程序运行期间给对象动态的添加功能。

很多时候我们不想去碰原函数,也许原函数是其他同事的,也可能是一个很古老的项目,现在可以通过装饰者模式在不改变原函数的情况下给函数增加功能。

使用场景

  • 统计
  • 表单验证
  • ..

案例

在项目开发中难免要加上很多统计代码,这些统计代码与业务代码并没有多大关系,那么使用装饰者模式再好不过了。

阅读全文

再一次,javascript设计模式与开发实践-中介者模式

简述

解除对象与对象之间的紧耦合关系。

当飞机想要降落时,会通知指挥塔,指挥塔安排降落,而不必和其他飞机通信,来保证安全。
购买足球彩票,只需要把钱交给博彩公司,博彩公司负责收钱和发钱,而不必与其他人交换信息。

使用场景

  • 游戏
  • 购物订单
  • ..

案例

如果要写一个购物订单程序,使用中介者模式是个很好的方式。

阅读全文

再一次,javascript设计模式与开发实践-职责链模式

简述

使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,这些对象连成一条链,并沿着链条传递该请求,直到有对象处理它为止。

例如高峰期搭公交,上车后没办法刷卡,只好把羊城通往前传递,经过几个人传递,最终才刷到卡。
例如上课时传纸条,同学间帮忙传递,最终送到要送到的人手上。

使用场景

  • 兼容判断
  • 订单优惠
  • ..

案例

我们负责的电商网站购买有一些优惠。

  • 支付500元定金得到100元优惠券。
  • 支付200元定金得到50元优惠券。
  • 不支付定金,无优惠。

阅读全文

再一次,javascript设计模式与开发实践-享元模式

简述

一种优化性能的模式,享元的核心是运用共享技术来有效支持大量细粒度的对象。

假设服装工厂有50种款式的衣服,为了推销产品工厂决定请模特来穿服装拍摄,在现实中不会请50名模特来试穿,所以在程序中享元模式指的就是这种情况。

使用场景

  • 地图图钉
  • 标签页
  • ..

案例

阅读全文

再一次,javascript设计模式与开发实践-模板模式

简述

一种典型的通过封装变化来提高可扩展性的模式。

模板模式由两个部分组成,一个抽象父类,一个具体子类,通常父类中封装了子类可用的公共实现,子类通过继承父类,也就继承了整个父类的实现,那么模板模式可以重写方法,或者直接重写父类方法。

使用场景

  • 过程类似,方式一致的

案例

阅读全文