设计模式的理解: 访问器模式 visitor -凯发k8官方网
凯发k8官方网
收集整理的这篇文章主要介绍了
设计模式的理解: 访问器模式 visitor
小编觉得挺不错的,现在分享给大家,帮大家做个参考.
在访问者模式(visitor pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法。通过这种方式,元素的执行算法可以随着访问者改变而改变。这种类型的设计模式属于行为型模式。根据模式,元素对象已接受访问者对象,这样访问者对象就可以处理元素对象上的操作。
在软件构建过程中,由于需求的改变,某些类层次结构中需要增加新的行为,如果这些操作在基类中进行更改,那么派生类也要做出响应的变更,给变更工作带来繁重的负担。访问器模式,就是把原来基类和派生类的实现放在访问器类中,各个派生类访问这些访问器的操作方法。而访问器中的操作方法接受派生类的实体,对派生类的属性进行操作。这样要变更操作方法只需要变更具体的访问器,而不需要变更基类和派生类。
以文件流和网络流为例, 其访问器模式 ,流的实现结构如下:
/*********建立稳定的实体类和抽象访问器类************/ class ivisitor{ public:virtual void visitfilestream(filestream & )=0;virtual void visitnetworkstream(networkstream &)=0; } class istream{ public:void acceptvisitor(ivisitor&) = 0; } class filestream : public istream{ public:file file_;void acceptvisitor(ivisitor& v){ v.visitfilestream(*this);} } class networkstream : public istream{ public:string url_;void acceptvisitor(ivisitor& v){ v.visitnetworkstream(*this);} }假如:流的功能有 读和写 , 那么 读操作和写操作不再 流对象中实现,而是把这些操作变成一个类的对象,这个类的对象派生自访问器类
/*****给流添加读写操作,(用伪码演示)*****/ class readstreamvisitor :ivisitor{string output_; public:virtual void visitfilestream(filestream &fs){file file = fs.file_;....output_=file.getcontent();}virtual void visitnetworkstream(networkstream & ns){netwoarkrequest netwoarkrequest(ns.url_);...output_=netwoarkrequest.getcontent();} }class writestreamvisitor :ivisitor{ public:string inputstr_; //输入参数可以用visitor存 public:virtual void visitfilestream(filestream &fs){file file = fs.file_;....file.write(inputstr_);}virtual void visitnetworkstream(networkstream & ns){netwoarkrequest netwoarkrequest(ns.url_);...netwoarkrequest.write(inputstr_);} }调用示例:
void main(){//读取网络内容networkstream ns;ns.url_ = "www.baidu.com";readstreamvisitor readvisitor;ns.accept(readvisitor);cout<<"网络读取的内容有:" <当然,访问者模式只适合类的层次结构稳定,操作扩展变动频繁的业务场景。所谓的层次结构稳定就是实体类的关系很少根据需求而变化。例如如果新增一个 databasestream,那么每个visitor都要再实现关于databasestream的操作。访问者模式的目的就是为了减少 实体和实体方法间的耦合程度,减小变更实体方法的影响性。如果层次结构不稳定,那么使用访问者模式就得不偿失.
总结
以上是凯发k8官方网为你收集整理的设计模式的理解: 访问器模式 visitor的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 设计模式的理解:命令模式 (comman
- 下一篇: 设计模式的理解:解释器模式 interp