zoukankan      html  css  js  c++  java
  • 【读书笔记】读《JavaScript设计模式》之桥接模式

    桥接模式(Bridge)将抽象部分与它的实现部分分离,使它们都可以独立地变化。

    一、使用场景

      使用场景一:事件监控

      对于前端而言,最典型的使用场景——事件监控。如——

    addEvent(element, 'click', getBeerById);
    
    // 可以看出这是一个只能工作在浏览器中的API,根据时间监听期回调函数的工作机制,事件对象会被作为第一个参数传递给这个函数。
    // 在本例中并没有使用这个参数,而只是从this对象获取ID。如果你对这个API函数做单元测试,就很困难了。
    // 对于API开发者来说,最好从一个优良的API开始,不要把它与任何特定的实现搅在一起。
    function getBeerById(e) {
        var id = this.id;
        asyncRequest('GET', 'beer.uri?id=' + id, function(resp) {
            // callback response
            console.log('Requested Beer:' + resp.responseText);
        });
    }

      我们希望所有人都能获取到啤酒的信息。也就是将获取啤酒信息的方法形成共有API。

    // 有利于独立的单元测试
    // 由于单独抽离了业务逻辑,在一定程度上,提高了代码的复用性。
    function getBeerById(id, callback) {
        // Make request for beer by ID, then return the beer data
        asyncRequest('GET', 'beer.uri?id=' + id, function(resp) {
            // callback response
            callback(resp.responseText);
        });
    }
    
    // 接下来,我们将针对接口而不是实现进行编程,用桥接模式把抽象隔离开来。
    addEvent(element, 'click', getBeerById);
    // 有了这层桥接元素,这个API的使用范围打打扩宽了,这给了你更大的设计自由。
    // 因为现在getBeerById并没有和事件对象捆绑在一起,你可以在单元测试中运行这个API。只需提供一个ID和回调函数即可。
    function getBeerByIdBridge(e) {
        getBeerById(this.id, function(beer) {
            console.log('Requested Beer:' + beer);
        });
    }

      使用场景二:特权函数

      提供共有API(即这里的桥接函数)来访问私有属性或者方法——

    // 除了在事件回调函数与接口之间进行桥接外,桥接模式也可以用于连接公开的API代码和私有的实现代码
    var Public = function() {
        var secret = 3;
    
        // 使用桥接模式来访问某些私有的信息。这里的桥接函数也称为特权函数
        this.privilegedGetter = function() {
            return secret++;
        };
    };
    
    var o = new Public();
    var data = o.privilegedGetter();

      使用场景三:实现组合

      在显示生活中,桥梁可以把多种事物联接起来,在JavaScript也是如此——

    var Class1 = function(a, b, c) {
        this.a = a;
        this.b = b;
        this.c = c;
    };
    
    var Class2 = function(d) {
        this.d = d;
    };
    
    // 有了这个桥接元素,Class1和Class2能够独立于BridgeClass而发生改变
    var BridgeClass = function(a, b, c, d) {
        this.one = new Class1(a, b, c);
        this.two = new Class2(d);
    };

    二、使用原则

      很难想象,不使用桥接模式的事件驱动编程回事什么样子。但是js编程新手们常常沉迷于事件驱动开发的函数式风格,忘了编写接口。哪怕面对的是复杂操作。判断什么地方应该使用桥接模式通常很简单。假如有下面的代码:

    $('#example').click(function() {
        new RichTextEditor();
    });

      从中你无法看出那个编辑器要显示在什么地方、它有些什么配置选项以及应该怎样修改它。这里的要诀是让接口“可桥接”,实际上也就是可适配。

    在现实生活中,桥梁对于城市建设和城中街道的联通至关重要。城区相当于模块,而街道相当于把他们连接在一起的方法。 道路的可用性往往影响着该片区的人口数量。同样,你向客户提供的接口极有可能影响到模块的受欢迎程度。

    三、优势及劣势

    优势:

      把抽象与其现实隔离开来,有助于独立地管理软件的各组成部分。达到充分解耦。Bug也因此更容易查找,而软件发生严重故障的可能性也减小了。有利于分层,从而产生更好的结构化系统。说到底,桥接元素应该是粘合每一个抽象的粘合因子。

    劣势:

      在我们看来,这种模式并没有多少真正的缺点。前面讲述它的优点的时候已经提过,它置灰让API更加健壮、提高组件的模块化程度并促成更简洁的客户系统实现。不过这些益处的确是有代价的。每使用一个桥接元素都要增加一次函数调用,这对应用程序的性能会有一些负面影响。此外,它们提高了系统的复杂程度,在出现问题时这回导致代码更难调试。大多数情况下桥接模式都非常有用,但注意不要滥用。举个例子来说,如果一个桥接函数被用于连接两个函数,而其中某个函数根本不会在桥接函数之外被调用,那么此时这个桥接函数就不是非要不可,你可以放心将它删除。

    源自:JavaScript设计模式(人民邮电出版社)——第八章,桥接模式

    参考:深入理解JavaScript系列(44):设计模式之桥接模式

  • 相关阅读:
    无题
    静心
    随笔
    skynet1.0阅读笔记2_skynet的消息投递skynet.call
    skynet1.0阅读笔记_skynet的启动
    Mysql: Connect/C++ 使用过程中发现返回 std::string 造成的内存泄露
    MySql C++调用库Connector/c++编译 和 接口封装【三】Connector/c++ 使用总结及封装
    MySql: ”Commands out of sync“Error (Connect/C++)
    Connector/c++ 查询Mysql,出现 can't fetch because not on result set 错误
    mysql 修改密码
  • 原文地址:https://www.cnblogs.com/jinguangguo/p/3652248.html
Copyright © 2011-2022 走看看