设计模式之组合模式(Composite)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。
创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象。创建型模式有两个不断出现的主旋律。第一,它们都将关于该系统使用哪些具体的类的信息封装起来。第二,它们隐藏了这些类的实例是如何被创建和放在一起的。整个系统关于这些对象所知道的是由抽象类所定义的接口。因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以及何时创建这些方面给予了很大的灵活性。它们允许用结构和功能差别很大的“产品”对象配置一个系统。配置可以是静态的(即在编译时指定),也可以是动态的(在运行时)。
结构型模式涉及到如何组合类和对象以获得更大的结构。结构型类模式采用继承机制来组合接口或实现。结构型对象模式不是对接口和实现进行组合,而是描述了如何对一些对象进行组合,从而实现新功能的一些方法。因为可以在运行时刻改变对象组合关系,所以对象组合方式具有更大的灵活性,而这种机制用静态类组合是不可能实现的。
行为模式涉及到算法和对象间职责的分配。行为模式不仅描述对象或类的模式,还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。行为类模式使用继承机制在类间分派行为。行为对象模式使用对象复合而不是继承。一些行为对象模式描述了一组对等的对象怎样相互协作以完成其中任一个对象都无法单独完成的任务。
创建型模式包括:1、FactoryMethod(工厂方法模式);2、Abstract Factory(抽象工厂模式);3、Singleton(单例模式);4、Builder(建造者模式、生成器模式);5、Prototype(原型模式).
结构型模式包括:6、Bridge(桥接模式);7、Adapter(适配器模式);8、Decorator(装饰模式);9、Composite(组合模式);10、Flyweight(享元模式);11、Facade(外观模式);12、Proxy(代理模式).
行为模式包括:13、TemplateMethod(模板方法模式);14、Strategy(策略模式);15、State(状态模式);16、Observer(观察者模式);17、Memento(备忘录模式);18、Mediator(中介者模式);19、Command(命令模式);20、Visitor(访问者模式);21、Chain of Responsibility(责任链模式);22、Iterator(迭代器模式);23、Interpreter(解释器模式).
Factory Method:定义一个用于创建对象的接口,让子类决定将哪一个类实例化。Factory Method使一个类的实例化延迟到其子类。
Abstract Factory:提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类。
Singleton:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
Builder:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。
Prototype:用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象。
Bridge:将抽象部分与它的实现部分分离,使它们都可以独立地变化。
Adapter:将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。
Decorator:动态地给一个对象添加一些额外的职责。就扩展功能而言, Decorator模式比生成子类方式更为灵活。
Composite:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得客户对单个对象和复合对象的使用具有一致性。
Flyweight:运用共享技术有效地支持大量细粒度的对象。
Facade:为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
Proxy:为其他对象提供一个代理以控制对这个对象的访问。
Template Method:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
Strategy:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法的变化可独立于使用它的客户。
State:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它所属的类。
Observer:定义对象间的一种一对多的依赖关系,以便当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动刷新。
Memento:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到保存的状态。
Mediator:用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。
Command:将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可取消的操作。
Visitor:表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。
Chain of Responsibility:为解除请求的发送者和接收者之间耦合,而使多个对象都有机会处理这个请求。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它。
Iterator:提供一种方法顺序访问一个聚合对象中各个元素, 而又不需暴露该对象的内部表示。
Interpreter:给定一个语言, 定义它的文法的一种表示,并定义一个解释器, 该解释器使用该表示来解释语言中的句子。
Composite:(1)、意图:将对象组合成树形结构以表示“部分--整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
(2)、适用性:A、你想表示对象的部分--整体层次结构;B、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
(3)、优缺点:A、定义了包含基本对象和组合对象的类层次结构:基本对象可以被组合成更复杂的组合对象,而这个组合对象又可以被组合,这样不断的递归下去。客户代码中,任何用到基本对象的地方都可以使用组合对象。B、简化客户代码:客户可以一致地使用组合结构和单个对象。通常用户不知道(也不关心)处理的是一个叶节点还是一个组合组件。这就简化了客户代码,因为在定义组合的那些类中不需要写一些充斥着选择语句的函数。C、使得更容易增加新类型的组件:新定义的Composite或Leaf子类自动地与已有的结构和客户代码一起工作,客户程序不需要因新的Component类而改变。D、使你的设计变得更加一般化:有时你希望一个组合只能有某些特定的组件。使用Composite时,你不能依赖类型系统施加这些约束,而必须在运行时刻进行检查。
(4)、注意事项:A、显示的父部件引用:保持从子部件到父部件的引用能简化组合结构的遍历和管理。父部件引用可以简化结构的上移和组件的删除,同时父部件引用也支持Chain of Responsibility。B、共享组件:共享组件是很有用的,比如它可以减少对存贮的需求。但是当一个组件只有一个父部件时,很难共享组件。C、最大化Component接口:Composite模式的目的之一是使得用户不知道他们正在使用的具体的Leaf和Composite类。为了达到这一目的,Composite类应为Leaf和Composite类尽可能多定义一些公共操作。Composite类通常为这些操作提供缺省的实现,而Leaf和Composite子类可以对它们进行重定义。D、声明管理子部件的操作。E、Component是否应该实现一个Component列表:你可能希望在Component类中将子节点集合定义为一个实例变量,而这个Component类中也声明了一些操作对子节点进行访问和管理。但是在基类中存放子类指针,对叶节点来说会导致空间浪费,因为叶节点根本没有子节点。只有当该结构中子类数目相对较少时,才值得使用这种方法。F、子部件排序:如果需要考虑子节点的顺序时,必须仔细地设计对子节点的访问和管理接口,以便管理子节点序列。Iterator模式可以在这方面给予一些指导。G、使用高速缓冲存贮改善性能:如果你需要对组合进行频繁的遍历或查找,Composite类可以缓冲存储对它的子节点进行遍历或查找相关信息。H、应该由谁删除Component:在没有垃圾回收机制的语言中,当一个Composite被销毁时,通常最好由Composite负责删除其子节点。但有一种情况除外,即Leaf对象不会改变,因此可以被共享。I、存贮组件最好用哪一种数据结构:Composite可使用多种数据结构存贮它们的子节点,包括连接列表、树、数组和hash表。数据结构的选择取决于效率。事实上,使用通用数据结构根本没有必要。有时对每个子节点,Composite都有一个变量与之对应,这就要求Composite的每个子类都要实现自己的管理接口。
(5)、相关模式:A、通常部件----父部件连接用于Responsibilityof Chain模式。B、Decorator模式经常与Composite模式一起使用。当装饰和组合一起使用时,它们通常有一个公共的父类。因此装饰必须支持具有Add、Remove和GetChild操作的Component接口。C、Flyweight让你共享组件,但不再能引用他们的父部件。D、Iterator可用来遍历Composite. E、Visitor将本来应该分布在Composite和Leaf类中的操作和行为局部化。
Composite模式在实现中有一个问题就是要提供对于子节点(Leaf)的管理策略,可以提供的实现方式有:vector、数组、链表、Hash表等。
Composite模式通过和Decorator模式有着类似的结构图,但是Composite模式旨在构造类,而Decorator模式重在不生成子类即可给对象添加职责。Decorator模式重在修饰,而Composite模式重在表示。
示例代码1:
#include <iostream>
#include <string>
#include <vector>using namespace std;class Component
{
public:string m_strName;Component(string strName){m_strName = strName;}virtual void Add(Component* com) = 0;virtual void Display(int nDepth) = 0;
};class Leaf : public Component
{
public:Leaf(string strName) : Component(strName) {}virtual void Add(Component* com){cout<<"leaf can't add"<<endl;}virtual void Display(int nDepth){string strtemp;for (int i = 0; i < nDepth; i ++)strtemp += "-";strtemp += m_strName;cout<<strtemp<<endl;}
};class Composite : public Component
{
private:vector<Component*> m_component;
public:Composite(string strName) : Component(strName) {}virtual void Add(Component* com){m_component.push_back(com);}virtual void Display(int nDepth){string strtemp;for (int i = 0; i < nDepth; i ++)strtemp += "-";strtemp += m_strName;cout<<strtemp<<endl;vector<Component*>::iterator p = m_component.begin();while (p != m_component.end()) {(*p)->Display(nDepth + 2);p ++;}}
};//客户端
int main()
{Composite* p = new Composite("小王");p->Add(new Leaf("小李"));p->Add(new Leaf("小赵"));Composite* p1 = new Composite("小小五");p1->Add(new Leaf("大三"));p->Add(p1);p->Display(1);/*result-小王---小李---小赵---小小五-----大三*/return 0;
}
示例代码2:
#include <iostream>
#include <string>
#include <vector>using namespace std;class Company
{
protected:string m_strName;
public:Company(string strName){m_strName = strName;}virtual void Add(Company* c) = 0;virtual void Display(int nDepth) = 0;virtual void LineOfDuty() = 0;
};class ConcreteCompany : public Company
{
private:vector<Company*> m_company;
public:ConcreteCompany(string strName) : Company(strName) {}virtual void Add(Company* c){m_company.push_back(c);}virtual void Display(int nDepth){string strtemp;for (int i = 0; i < nDepth; i ++)strtemp += "-";strtemp += m_strName;cout<<strtemp<<endl;vector<Company*>::iterator p = m_company.begin();while (p != m_company.end()) {(*p)->Display(nDepth + 1);p ++;}}virtual void LineOfDuty(){vector<Company*>::iterator p = m_company.begin();while (p != m_company.end()) {(*p)->LineOfDuty();p ++;}}
};class HrDepartment : public Company
{
public:HrDepartment(string strname) : Company(strname) {}virtual void Display(int nDepth){string strtemp;for (int i = 0; i < nDepth; i ++)strtemp += "-";strtemp += m_strName;cout<<strtemp<<endl;}virtual void Add(Company* c){cout<<"error"<<endl;}virtual void LineOfDuty(){cout<<m_strName<<":招聘人才"<<endl;}
};//客户端
int main()
{ConcreteCompany* p = new ConcreteCompany("清华大学");p->Add(new HrDepartment("清华大学人才部"));ConcreteCompany* p1 = new ConcreteCompany("数学系");;p1->Add(new HrDepartment("数学系人才部"));ConcreteCompany* p2 = new ConcreteCompany("物理系");p2->Add(new HrDepartment("物理系人才部"));p->Add(p1);p->Add(p2);p->Display(1);p->LineOfDuty();/*result-清华大学--清华大学人才部--数学系---数学系人才部--物理系---物理系人才部清华大学人才部:招聘人才数学系人才部:招聘人才物理系人才部:招聘人才*/return 0;
}
示例代码3:
Component.h:
#ifndef _COMPONENT_H_
#define _COMPONENT_H_class Component
{
public:Component();virtual ~Component();
public:virtual void Operation() = 0;virtual void Add(const Component&);virtual void Remove(const Component&);virtual Component* GetChild(int);
protected:
private:
};#endif//~_COMPONENT_H_
Component.cpp:
#include "Component.h"Component::Component()
{}Component::~Component()
{}void Component::Add(const Component&)
{}Component* Component::GetChild(int index)
{return 0;
}void Component::Remove(const Component& com)
{}
Composite.h:
#ifndef _COMPOSITE_H_
#define _COMPOSITE_H_#include "Component.h"
#include <vector>using namespace std;class Composite : public Component
{
public:Composite();~Composite();
public:void Operation();void Add(Component* com);void Remove(Component* com);Component* GetChild(int index);
protected:
private:vector<Component*> comVec;
};#endif//~_COMPOSITE_H_
Composite.cpp:
#include "Composite.h"
#include "Component.h"#define NULL 0 //define NULL POINTORComposite::Composite()
{//vector<Component*>::iterator itend = comVec.begin();
}Composite::~Composite()
{}void Composite::Operation()
{vector<Component*>::iterator comIter = comVec.begin();for (; comIter != comVec.end(); comIter ++)(*comIter)->Operation();
}void Composite::Add(Component* com)
{comVec.push_back(com);
}void Composite::Remove(Component* com)
{//comVec.erase(&com);
}Component* Composite::GetChild(int index)
{return comVec[index];
}
Leaf.h:
#ifndef _LEAF_H_
#define _LEAF_H_#include "Component.h"class Leaf : public Component
{
public:Leaf();~Leaf();void Operation();
protected:
private:
};#endif //~_LEAF_H_
#include "Leaf.h"
#include <iostream>using namespace std;Leaf::Leaf()
{}Leaf::~Leaf()
{}void Leaf::Operation()
{cout<<"Leaf Operation ..."<<endl;
}
main.cpp:
#include "Component.h"
#include "Composite.h"
#include "Leaf.h"
#include <iostream>using namespace std;int main()
{Leaf* l = new Leaf();l->Operation();Composite* com = new Composite();com->Add(l);com->Operation();Component* ll = com->GetChild(0);ll->Operation();/*resultLeaf Operation ...Leaf Operation ...Leaf Operation ...*/return 0;
}
组合模式结构图:
参考文献:
1、《大话设计模式C++》
2、《设计模式精解----GoF23种设计模式解析》
3、《设计模式----可复用面向对象软件的基础》
相关文章:

快速开发生命周期支持工具
去年有幸研究公司管理产品的软件平台,当时考虑的产品是基于业务模型之上的一个系统平台,从建模到运行、部署、维护全生命周期管理.当时就提出两个希望先实践解决的就是可复用原型的设计和使用工作流和规则引擎的协作处理询标产品.前一阵子在公司研究成本产品的成本分析和算法,一…

华人学者解开计算机领域30年难题:布尔函数敏感度猜想
整理 | 郭芮来源 | CSDN(ID:CSDNnews)1992年,布尔函数敏感度猜想(Boolean Sensitivity)被提出,这成为了理论计算机科学近三十年来最重要、最令人困惑的开放性问题之一。而近日,来自E…

从1.5K到18K 一个程序员的5年成长之路(二)
这一切都来自于心态CSDN:从开始学习,到学有所成和找工作,再到工作中遇到各种困难,然后获得突破,在整个过程中,能总结下你心态都有哪些变化?是用运用什么方法或方式进行调整?雷果国&a…
设计模式之享元模式(Flyweight)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

你想见的大神都来AI ProCon 2019了,优惠票限时抢购开启!
如今 AI 的发展真实地面临着诸多瓶颈、尽管很多智能助手已经可以执行很多任务,但距离真正的人机自然交互还需要很长时间;强人工智能也迟迟未出现,不知何时才能出现;现有的 AI 只能做好一件事,Alpha Go 只会下棋&#x…

qt练习11 鼠标,按键,滚轮事件学习
源代码: http://files.cnblogs.com/hnrainll/event.zip

windows server 2008 R2上安装MRTG指南
一、实验环境 参考教程:http://www.netmon.org/dummies.htm http://www.docin.com/p-158415185.html MRTG中文手册:http://bbs.chinaunix.net/thread-1344687-1-1.html http://www.enterastream.com/whitepapers/mrtg/mrtg-manual-cap9.html 1.硬件平台 …
设计模式之外观模式(Facade)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

知识图谱公开课 | 详解事件抽取与事件图谱构建
现有知识图谱大多关注于以实体为核心的静态知识,缺乏对于以事件为核心的动态知识的刻画和构建。如何从非结构化文本中抽取结构化的事件知识已成为眼下热门研究课题。本次公开课中,我们邀请到了中科院自动化所模式识别国家重点实验室助理研究员陈玉博&…

实时显示系统时间
CTime time;CString m_time;void CtimeDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码 SetTimer(1,1000,NULL);}void CtimeDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值 timeCTime::GetCurrentTime(); …

安卓手机文件管理器:360°LES文件浏览器
360度LES文件浏览器功能可谓是非常强大,可以对文件或文件夹进行新建、复制、剪切、删除、移动、搜索等操作。支持多标签页,能设置成root级别的管理器, 关联文件打开,列表或图标的形式显示,拖曳文件,多标签页下文件拖曳(下面有详细的讲解)&…

XML DTD 语言学习笔记
-XML DTD 全称:Document Type Definition简介:用于定义文档的合法性。它定义了文档应该有哪些元素及其属性,还有其他一些约束性规则。 注意:DTD语言定义的文档类型是SGML家族的标记性语言。包括SGML,XML,HTML)…

Python快速入门,你想要的就在这里了!
学习Python您是否会面临以下问题?“网上充斥着大量的学习资源、书籍、视频教程和博客,但是大部分都是讲解基础知识,不够深入;也有的比较晦涩,难以理解”CSDN Python学习社群将帮助您过滤网上的垃圾教程资源的技能&…
设计模式之代理模式(Proxy)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

Symfony学习笔记
Symfony学习笔记Symfony本来已经接触过了,可发现好久 不用好多东西都已经遗忘了,决定再次拾起,看能不能发现之前没有注意到的新的东西。果然在不断学习的过程中,又发现了许多自认为很细节但又很重要的地方,下面就列举如…
设计模式之模板方法模式(Template Method)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

Linux练习(显示环境变量)
#include <stdio.h> #include <stdlib.h> extern char **environ; int main() {char **envenviron;while(*env){printf("%s\n",*env);env;}exit(0); } 主要是environ变量,定义如下 #include <stdlib> extern char **environ;

百度发布ERNIE 2.0,性能超BERT、XLNet
作者 | Khari Johnson 译者 | 赵雪 编辑 | 夕颜 出品 | AI科技大本营(ID: rgznai100) 中国科技巨头百度于今日提出了 ERNIE 2.0——一个中英双语的会话式人工智能模型。ERNIE 2.0 在语言理解基准上的表现超过了谷歌的 BERT 和 XLNet,在 9 个国…

php中mkdir()函数的权限问题
为什么80%的码农都做不了架构师?>>> 遇到个问题 某个定时job用root用户mkdir(./test/,0777)新建了目录,指定了权限是0777,结果获得的是0755, 而web上用www用户也在这目录创建目录和文件,结果报错了,一开始…
设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

PreparedStatement
该 PreparedStatement接口继承Statement,并与之在两方面有所不同: PreparedStatement 实例包含已编译的 SQL 语句。这就是使语句“准备好”。包含于 PreparedStatement 对象中的 SQL 语句可具有一个或多个 IN 参数。IN参数的值在 SQL 语句创建时未被指…

百度ERNIE 2.0发布!16项中英文任务表现超越BERT和XLNet
整理 | 夕颜出品 | AI科技大本营(ID:rgznai100)导读:2019 年 3 月,百度正式发布 NLP 模型 ERNIE,其在中文任务中全面超越 BERT 一度引发业界广泛关注和探讨。今天,百度发布了 ERNIE 2.0,指出其在…

WindowsServer2012史记7-茴香豆的五种写法和四种”显示计算机”的方法
消失的"计算机"?【这周九叔工作比较忙,还有其他琐事缠身,因此SystemCenter2012SP1系列的发布稍慢,抱歉了各位。】众所周知,WindowsServer2012和Windows8一样,默认桌面上是没有"计算机"…
设计模式之状态模式(State)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

CYQ学习主要摘要4
http://www.cnblogs.com/cyq1162/archive/2010/11/03/1867642.html Xml的处理 http://www.cnblogs.com/cyq1162/archive/2010/11/23/1885299.html 3.5版本 http://www.cnblogs.com/cyq1162/archive/2010/12/27/1918317.html 无线分级 http://www.cnblogs.com/cyq1162/archive/2…

知识图谱、深度学习、AutoML,推荐系统与新技术结合将碰撞出怎样的火花?
近日,来自意大利米兰理工大学 Maurizio 团队发表的一篇极具批判性的文章火了。这篇文章剑指推荐系统领域的其他数十篇论文,并通过多项试验证明这些论文中基于深度学习的推荐算法大部分都存在不同程度的数据集缺失和源码缺失的问题,导致根本无…

python-range用法
2019独角兽企业重金招聘Python工程师标准>>> 详细记录python的range()函数用法 转载于:https://my.oschina.net/lxwgmail/blog/135228
设计模式之观察者模式(Observer)摘录
23种GOF设计模式一般分为三大类:创建型模式、结构型模式、行为模式。 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的那些对象。一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给…

中科院、百度研究院等联合提出UGAN,生成图片难以溯源
作者 | 中国科学院、北京航空航天大学、百度研究院团队译者 | 凯隐编辑 | 夕颜出品 | AI科技大本营(ID: rgznai100)导读:生成对抗网络(GAN)是近年大热的深度学习模型,中国科学院相关团队注意到,…

搜索引擎的时效性需求满足
“全、准、快、新”是搜索引擎的四大评价指标,其中的“新”指代的就是时效性。随着互联网的发展,网民对信息获取的时效性要求越来越高。同时越来越多的网民更多的参与到创造互联网内容中去,互联网上的新信息也在迅速的膨胀。这都给搜索引擎时…