东营市两学一做考试网站,中文的网站做不成二维码,美工背景图素材,网站建设用什么视频播放器C 设计模式之访问者模式
简介
1、访问者模式 #xff08;Visitor#xff09;是一种行为型设计模式#xff0c;它表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 使用该模式可以在不修改已有程序结构的前提…C 设计模式之访问者模式
简介
1、访问者模式 Visitor是一种行为型设计模式它表示一个作用于某对象结构中的各元素的操作。它使你可以在不改变各元素的类的前提下定义作用于这些元素的新操作。 使用该模式可以在不修改已有程序结构的前提下通过添加额外的访问者类实现新的操作。
2、访问者模式 Visitor应用场景包括但不限于 2.1、对象结构比较稳定但操作经常变化的程序。 2.2、需要对一个对象结构中的对象进行很多不同而且不相关的操作而你想避免让这些操作“污染”这些对象的类。
3、访问者模式 Visitor的构成 3.1、访问者Visitor定义了一个访问操作中的元素的接口。这个接口使得访问者可以不修改类的结构就可以增加新的操作。
class DocumentVisitor
{
public:virtual ~DocumentVisitor() {}virtual void visitParagraph(class ParagraphElement* element) 0;virtual void visitImage(class ImageElement* element) 0;virtual void visitTable(class TableElement* element) 0;
};3.2、元素Element声明一个接受访问者对象的接口。这个接口通常包含一个或多个由访问者接口定义的方法。
class DocumentElement
{
public:virtual ~DocumentElement() {}virtual void accept(DocumentVisitor* visitor) 0;
};4、访问者模式 Visitor的优点 4.1、封装性 可以在不改变元素类的情况下定义新的操作。 4.2、扩展性 新的访问者可以很容易地添加新的操作。 4.3、分离关注点 移动相关的操作集中到访问者中而不是分散在元素类中。
5、访问者模式 Visitor的缺点 5.1、违反封装 访问者可能需要访问元素的内部细节这通常意味着元素必须暴露一些原本应该是私有的数据。 5.2、复杂度 可以使系统变得更加复杂特别是当系统有大量元素时。 5.3、对象结构变化困难 如果经常改变对象结构的元素类那么维护访问者模式将会非常麻烦。
简单示例
1、定义
// 抽象访问者
class DocumentVisitor
{
public:virtual ~DocumentVisitor() {}virtual void visitParagraph(class ParagraphElement* element) 0;virtual void visitImage(class ImageElement* element) 0;virtual void visitTable(class TableElement* element) 0;
};// 元素基类
class DocumentElement
{
public:virtual ~DocumentElement() {}virtual void accept(DocumentVisitor* visitor) 0;
};class ParagraphElement : public DocumentElement
{
public:void accept(DocumentVisitor* visitor);
};class ImageElement : public DocumentElement
{
public:void accept(DocumentVisitor* visitor);
};class TableElement : public DocumentElement
{
public:void accept(DocumentVisitor* visitor);
};// 渲染访问者
class RenderVisitor : public DocumentVisitor
{
public:void visitParagraph(class ParagraphElement* element);void visitImage(class ImageElement* element);void visitTable(class TableElement* element);
};// 检查访问者
class CheckVisitor : public DocumentVisitor
{
public:void visitParagraph(class ParagraphElement* element);void visitImage(class ImageElement* element);void visitTable(class TableElement* element);
};2、实现
void ParagraphElement::accept(DocumentVisitor* visitor)
{visitor-visitParagraph(this);
}void ImageElement::accept(DocumentVisitor* visitor)
{visitor-visitImage(this);
}void TableElement::accept(DocumentVisitor* visitor)
{visitor-visitTable(this);
}void RenderVisitor::visitParagraph(class ParagraphElement* element)
{std::cout Render Paragraph std::endl;
}void RenderVisitor::visitImage(class ImageElement* element)
{std::cout Render Image std::endl;
}void RenderVisitor::visitTable(class TableElement* element)
{std::cout Render Table std::endl;
}void CheckVisitor::visitParagraph(class ParagraphElement* element)
{std::cout Check Paragraph std::endl;
}void CheckVisitor::visitImage(class ImageElement* element)
{std::cout Check Image std::endl;
}void CheckVisitor::visitTable(class TableElement* element)
{std::cout Check Table std::endl;
}3、调用
std::vectorDocumentElement* vecDoc {new ParagraphElement(),new ImageElement(),new TableElement()
};
RenderVisitor renderVisitor;
CheckVisitor checkVisitor;for (auto elem : vecDoc)
{elem-accept(renderVisitor);elem-accept(checkVisitor);
}for (auto el : vecDoc)
{delete el;
}