zoukankan      html  css  js  c++  java
  • 设计模式--访问者模式C++实现

    访问者模式C++实现

    1定义Visitor Pattern

    封装一些作用于某种数据结构中各元素的操作,他可以在不改变数据结构的前提下定义作用于这些元素新的操作

    2类图

    角色分析

    Visitor抽象访问者,声明可以访问哪些元素,具体到程序中就是Visit方法参数定义哪些对象可以被访问

    ConcreteVisitor,他影响访问者访问到一个类之后该怎么做

    Element抽象元素,声明哪一个类访问者访问,程序上通过accept方法中的参数定义

    ConcreteElement实现accept方法,visitor.visit(this)基本形成一种模式

    ObjectStrture结构对象,元素产生者,一般容纳多个不同类,不同接口的容器,如list,set,map,在项目中一般很少抽象这个角色

    3实现

    class Element

    {

    protected:

      Element();

    public:

      void doSomething();

      void accept(Ivisitor visitor) = 0;

      virtual ~Element() = 0;

    };

    class ConcreteElement

    {

    public:

      void doSomething();

      void accept(IVisitor visitor)

      {

        visitor.visit(*this);

      }

    };

    class IVisitor

    {

    public:

      void Visitor(ConcreteElent el);

    };

    class Visitor:public IVisitor

    {

    public:

      void visit(Concrete el)

      {

        el.doSomething();

      }

    };

    //结构体对象

    class ObjectStuture

    {

    public:

      static Element createElement()

      {

        Random rand = new Random();

        return new ConcreteElement();

      }

    };

    4应用

    ①优点

    单一职责,Elementz子类加载数据,Visitor负责报表展示

    优秀的扩展性,增加数据操作是很方便的

    灵活性高,可以实现Element提供数据,Visitor对数据进行修饰并呈现

    ②缺点

    具体元素对访问者公布细节

    具体元素变更困难,因为要同时变更Visitor

    违背依赖倒置原则,访问者依赖具体元素而不是抽象元素

    ③使用场景

    一个对象结构包含很多类对象,他们接口不同,而你需要对其是实施的具体操作依赖具体类.迭代器模式不能胜任

    需要对一个结构体中的对象进行很多不同且不相关的操作,且不想操作 污染对象的类。

    ::业务规则要求遍历多个不同的对象,与迭代器模式对比。

    同时访问者模式也可以充当拦截器角色,在混编模式中

    5扩展

    ①统计功能

    将数据统计和批处理通过访问者模式进行处理

    ②多个访问者

  • 相关阅读:
    basic-linux
    巧用border属性
    git常用操作笔记
    如何删除github里的项目
    常用css3属性的ie兼容查看
    新建pc端页面的模板
    HTML5 Shiv--解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
    进程和线程
    C++对象模型---第 4 章 Function语意学
    C++对象模型---第 3 章 Data语意学
  • 原文地址:https://www.cnblogs.com/lang5230/p/5339554.html
Copyright © 2011-2022 走看看