RSS阅读器

由于我们只想跟RSS容器对象打交道,所以用一个工厂来实例化这些内部对象并把它们组装到一个RSS阅读器中.

使用工厂方法在好处在于,我们创建的RSS阅读器类不会与那些成员对象紧密耦合在一起.

RSS阅读器的成员对象

成员对象1: xhr

这个对象就是上一篇中介绍过的,所以就不再说了.

成员对象2: 显示类

为了满足RSS阅读器类的需要,它需要实现几个方法.

  1. var DisplayModule = new Interface('DisplayModule', ['append', 'remove', 'clear']);
  2. var ListDisplay = function(id, parent){
  3. this.list = document.createElement('ul');
  4. this.list.id = id;
  5. parent.appendChild(this.list);
  6. };
  7. ListDisplay.prototype = {
  8. append: function(text){
  9. var newEl = document.createElement('li');
  10. this.list.appendChild(newEl);
  11. newEl.innerHTML = text;
  12. return newEl;
  13. },
  14. remove: function(el){
  15. this.list.removeChild('el');
  16. },
  17. clear: function(){
  18. this.list.innerHTML = '';
  19. }
  20. };

成员对象3: 配置对象

这只是一个对象字面量,它包含着一些借位阅读器类及其成员对象使用的设置

  1. var conf = {
  2. id: 'con-top-stories',
  3. feedUrl: 'http://www.baidu.com',
  4. updateInteval: 60,
  5. parent: $('feed-readers')
  6. };

RSS阅读对象类

上面介绍的类都由一个名为FeedReader的类组合使用.它用xhr处理器从RSS源获取XML格式的数据并用一个内部方法进行解析,然后用显示模块将解析出来的信息输出到网页上.

  1. var FeedReader = function(display, xhrHandler, conf){
  2. this.display = display;
  3. this.xhrHandler = xhrHandler;
  4. this.conf = conf;
  5.  
  6. this.startUpdates();
  7. };
  8. FeedReader.prototype = {
  9. fetchFeed: function(){
  10. var that = this;
  11. var callback = {
  12. success: function(text, xml) {that.parseFeed(text, xml)},
  13. failure: function(status) {that.showError(status);}
  14. };
  15. this.xhrHandler.request('GET', 'feedProxy.php?feed='+this.conf.feedUrl, callback);
  16. },
  17. parseFeed: function(responseText, responseXML){
  18. this.display.clear();
  19. var items = responseXML.getElementsByTagName('item');
  20. for(var i= 0, len=items.length; i<len; i++){
  21. var title = items[i].getElementsByTagName('title')[0];
  22. var link = items[i].getElementsByTagName('link')[0];
  23. this.display.append('<a href="'+link.firstChild.data+'">'+this.firstChild.data+'</a>');
  24. }
  25. },
  26. showError: function(statusCode){
  27. this.display.clear();
  28. this.display.append('Error fetching feed.');
  29. },
  30. stopUpdates: function(){
  31. clearInterval(this.interval);
  32. },
  33. startUpdates: function(){
  34. this.fetchFeed();
  35. var that = this;
  36. this.interval = setInterval(function(){that.fetchFeed();}, this.conf.updateInteval*1000);
  37. }
  38. };

使用工厂方法

现在还差一个部分,即把所有这些类和对象拼装起来的那个工厂方法.它被实现为一个简单工厂,如下所示.

  1. var FeedManager = {
  2. createFeedReader: function(conf){
  3. var displayModule = new ListDisplay(conf.id+'-display',conf.parent);
  4. Interface.ensureImplements(displayModule, DisplayModule);
  5.  
  6. var xhrHandler = XhrManager.createXhrHandler();
  7. Interface.ensureImplements(xhrHandler, AjaxHandler);
  8.  
  9. return new FeedReader(displayModule, xhrHandler, conf);
  10. }
  11. }

使用这个工厂方法,可以把FeedReader类所需的复杂设置封装起来,并且可以确保其成员对象都实现所需接口.

它还把对所使用在特定模块的硬性设定集中在一个位置(ListDisplay和createXhrHandler),哪天要是想使用ParagraphDisplay和QueueHandler,做起来也同样简单,只要改改这个工厂方法内部的代码就行.

等.

JS设计模式——7.工厂模式(示例-RSS阅读器)的更多相关文章

  1. JS设计模式——7.工厂模式(示例-XHR)

    XHR工厂 基本实现 var AjaxHandler = new Interface('AjaxHandler', ['request', 'createXHR']); var SimpleHandl ...

  2. [JS设计模式]:工厂模式(3)

    简单工厂模式是由一个方法来决定到底要创建哪个类的实例, 而这些实例经常都拥有相同的接口. 这种模式主要用在所实例化的类型在编译期并不能确定, 而是在执行期决定的情况. 说的通俗点,就像公司茶水间的饮料 ...

  3. js设计模式:工厂模式、构造函数模式、原型模式、混合模式

    一.js面向对象程序 var o1 = new Object();     o1.name = "宾宾";     o1.sex = "男";     o1.a ...

  4. JS设计模式之工厂模式

    1 什么是工厂模式? 工厂模式是用来创建对象的一种最常用的设计模式.我们不暴露创建对象的具体逻辑,而是将将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂.工厂模式根据抽象程度的不同可以分为: ...

  5. JS设计模式--简单工厂模式

    在JS中创建对象会习惯的使用new关键字和类构造函数(也是可以用对象字面量). 工厂模式就是一种有助于消除两个类依赖性的模式. 工厂模式分为简单工厂模式和复杂工厂模式,这篇主要讲简单工厂模式. 简单工 ...

  6. JS设计模式——7.工厂模式(概念)

    工厂模式 本章讨论两种工厂模式: 简单工厂模式 使用一个类(通常是一个单体)来生成实例. 使用场景:假设你想开几个自行车商店(创建自行车实例,组装它,清洗它,出售它),每个店都有几种型号的自行车出售. ...

  7. JavaScript设计模式(3)-工厂模式

    工厂模式 1. 简单工厂 简单工厂:使用一个类或对象封装实例化操作 假如我们有个自行车商店类 BicycleShop,它提供了销售自行车的方法可以选择销售两类自行车 Speedster,Comfort ...

  8. C#学习之设计模式:工厂模式

    最近研究一下设计模式中工厂模式的应用,在此记录如下: 什么是工厂模式? 工厂模式属于设计模式中的创造型设计模式的一种.它的主要作用是协助我们创建对象,为创建对象提供最佳的方式.减少代码中的耦合程度,方 ...

  9. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

随机推荐

  1. javascript 进阶篇1 正则表达式,cookie管理,userData

    首先,什么事正则表达式呢,其实引入概念很多时候并不能帮我们明白它到底是什么,所以我先简单描述下,正则表达式,其实就是一个记录字符串规则则的字符串,等我们看完这一部分,也就能明白它到底是什么了. 基本语 ...

  2. Java的StringBuIlder扩容机制

    JDK 1.6中,扩容的源码是这样: void expandCapacity(int minimumCapacity) { int newCapacity = (value.length + 1) * ...

  3. Zookeeper的基础

    认识Zookeeper zookeeper是什么 分布式数据的一致性解决方案. Zookeeper 能做什么 数据发布和订阅(配置中心,config,disconf,diamond,appollo) ...

  4. C++模式学习------工厂模式

    工厂模式属于创建型模式,大致可以分为简单工厂模式.抽象工厂模式. 简单工厂模式,它的主要特点是需要在工厂类中做判断,从而创造相应的产品. enum PTYPE { ProdA = , ProdB = ...

  5. SDOI2017硬币游戏

    题面链接 洛咕 sol 神题,幸好我不是SD的QAQ. 假设你们都会\(O(n^3m^3)\)的高斯消元,具体来说就是建出\(Trie\)图然后套游走的板子. 然后我们发现可以把不能匹配任何串的概率压 ...

  6. 【BZOJ2655】Calc(拉格朗日插值,动态规划)

    [BZOJ2655]Calc(多项式插值,动态规划) 题面 BZOJ 题解 考虑如何\(dp\) 设\(f[i][j]\)表示选择了\(i\)个数并且值域在\([1,j]\)的答案. \(f[i][j ...

  7. rsync命令比对文件及增量同步

    A fast,versatile,remote (and local) file-copying tool. rsync基于ssh协议实现高效率远程或本地文件复制,传输速度比scp快.复制文件时会比对 ...

  8. 【费用流】【网络流24题】【P4013】 数字梯形问题

    Description 给定一个由 \(n\) 行数字组成的数字梯形如下图所示. 梯形的第一行有 \(m\) 个数字.从梯形的顶部的 \(m\) 个数字开始,在每个数字处可以沿左下或右下方向移动,形成 ...

  9. ZABBIX 3.0 监控MongoDB性能【OK】

    系统环境: centos7.2 zabbix-3.4   一.原理  通过以下命令查看mongodb的状态: echo "db.serverStatus()" | mongo ad ...

  10. Ansible4:Ad-hoc与命令执行模块

    目录 Ad-hoc 命令说明 后台执行 命令执行模块 command模块 script模块 Ad-Hoc 是指ansible下临时执行的一条命令,并且不需要保存的命令,对于复杂的命令会使用playbo ...