最新公告
  • 欢迎您光临码农资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!加入我们
  • 学习JavaScript设计模式之模板方法模式

    一、定义

    模板方法是基于继承的设计模式,可以很好的提高系统的扩展性。 
    模板方法有两部分结构组成,第一部分是抽象父类,第二部分是具体的实现子类。

    二、示例

    Coffee or Tea
    (1) 把水煮沸
    (2) 用沸水浸泡茶叶
    (3) 把茶水倒进杯子
    (4) 加柠檬

    /* 抽象父类:饮料 */
    var Beverage = function(){};
    // (1) 把水煮沸
    Beverage.prototype.boilWater = function() {
      console.log("把水煮沸");
    };
    // (2) 沸水浸泡
    Beverage.prototype.brew = function() {
      throw new Error("子类必须重写brew方法");
    };
    // (3) 倒进杯子
    Beverage.prototype.pourInCup = function() {
      throw new Error("子类必须重写pourInCup方法");
    };
    // (4) 加调料
    Beverage.prototype.addCondiments = function() {
      throw new Error("子类必须重写addCondiments方法");
    };
    
    /* 模板方法 */
    Beverage.prototype.init = function() {
      this.boilWater();
      this.brew();
      this.pourInCup();
      this.addCondiments();
    }
    
    /* 实现子类 Coffee*/
    var Coffee = function(){};
    Coffee.prototype = new Beverage();
    // 重写非公有方法
    Coffee.prototype.brew = function() {
      console.log("用沸水冲泡咖啡");
    };
    Coffee.prototype.pourInCup = function() {
      console.log("把咖啡倒进杯子");
    };
    Coffee.prototype.addCondiments = function() {
      console.log("加牛奶");
    };
    var coffee = new Coffee();
    coffee.init();
    
    

    通过模板方法模式,在父类中封装了子类的算法框架。这些算法框架在正常状态下是适用大多数子类的,但也会出现“个性”子类。
    如上述流程,加调料是可选的。
    钩子方法可以解决这个问题,放置钩子是隔离变化的一种常见手段。

    /* 添加钩子方法 */
    Beverage.prototype.customerWantsCondiments = function() {
      return true;
    };
    Beverage.prototype.init = function() {
      this.boilWater();
      this.brew();
      this.pourInCup();
      if(this.customerWantsCondiments()) {
        this.addCondiments();
      }
    }
    
    /* 实现子类 Tea*/
    var Tea = function(){};
    Tea.prototype = new Beverage();
    // 重写非公有方法
    Tea.prototype.brew = function() {
      console.log("用沸水冲泡茶");
    };
    Tea.prototype.pourInCup = function() {
      console.log("把茶倒进杯子");
    };
    Tea.prototype.addCondiments = function() {
      console.log("加牛奶");
    };
    Tea.prototype.customerWantsCondiments = function() {
      return window.confirm("需要添加调料吗?");
    };
    var tea = new Tea();
    tea.init();
    
    

    JavaScript没有提供真正的类式继承,继承是通过对象与对象之间的委托来实现的。

    三、“好莱坞原则”:别调用我们,我们会调用你

    典型使用场景:

    (1)模板方法模式:使用该设计模式意味着子类放弃了对自己的控制权,而是改为父类通知子类。作为子类,只负责提供一些设计上的细节。
    (2)观察者模式:发布者把消息推送给订阅者。
    (3)回调函数:ajax异步请求,把需要执行的操作封装在回调函数里,当数据返回后,这个回调函数才被执行。

    希望本文所述对大家学习javascript程序设计有所帮助。

    想要了解更多内容,请持续关注码农资源网,一起探索发现编程世界的无限可能!
    本站部分资源来源于网络,仅限用于学习和研究目的,请勿用于其他用途。
    如有侵权请发送邮件至1943759704@qq.com删除

    码农资源网 » 学习JavaScript设计模式之模板方法模式
    • 20会员总数(位)
    • 16192资源总数(个)
    • 1118本周发布(个)
    • 21 今日发布(个)
    • 115稳定运行(天)

    提供最优质的资源集合

    立即查看 了解详情