美文网首页
C++11访问者模式展示

C++11访问者模式展示

作者: FredricZhu | 来源:发表于2021-07-18 06:29 被阅读0次

题目


image.png

题目作者把accept和visit方法写反了,但是这不影响做题。
你也反着写就行了。
就是看着有点别扭。
这里的实现方式是传统的双向转发方式。
就是每个被访问对象有一个accept方法,接收访问者的访问。
访问对象有一堆visit方法,可以访问各种对象。[我是按正常的思路来说的,和代码刚好相反。]
这是这23种中最复杂的一个模式了。
因为它涉及到类层级的遍历。

程序代码如下,

#include <string>
#include <sstream>
using namespace std;

struct Value;
struct AdditionExpression;
struct MultiplicationExpression;

struct ExpressionVisitor
{
   virtual void accept(Value& e) = 0;
   virtual void accept(AdditionExpression& ae) = 0;
   virtual void accept(MultiplicationExpression& me) = 0;
};

struct Expression
{
  virtual void visit(ExpressionVisitor& ev) = 0;
};

struct Value : Expression
{
  int value;

  Value(int value) : value(value) {}
  
  void visit(ExpressionVisitor& ev) {
      ev.accept(*this);
  }
};

struct AdditionExpression : Expression
{
  Expression &lhs, &rhs;

  AdditionExpression(Expression &lhs, Expression &rhs) : lhs(lhs), rhs(rhs) {}
  
  void visit(ExpressionVisitor& ev) {
      ev.accept(*this);
  }
};

struct MultiplicationExpression : Expression
{
  Expression &lhs, &rhs;

  MultiplicationExpression(Expression &lhs, Expression &rhs)
    : lhs(lhs), rhs(rhs) {}
    
  void visit(ExpressionVisitor& ev) {
      ev.accept(*this);
  }
};

struct ExpressionPrinter : ExpressionVisitor
{
   void accept(Value& e) override {
       oss << e.value;    
   }
   
   // 所有加法都需要()
   void accept(AdditionExpression& ae) override {
       oss << "(";
       ae.lhs.visit(*this);
       oss << "+";
       ae.rhs.visit(*this);
       oss << ")";
   }
   
   // 乘法只有右值是加法的时候需要()
   void accept(MultiplicationExpression& me) override {
       bool need_braces = (typeid(me.rhs) == typeid(AdditionExpression));
       if(need_braces) oss << "(";
       me.lhs.visit(*this);
       oss << "*";
       me.rhs.visit(*this);
       if(need_braces) oss << ")";
   }
    

  string str() const { 
        return oss.str();
  }
  
  private:
    ostringstream oss;
};

相关文章

  • C++11访问者模式展示

    题目 题目作者把accept和visit方法写反了,但是这不影响做题。你也反着写就行了。就是看着有点别扭。这里的实...

  • 设计模式之访问者模式(visitor模式)

    引入访问者模式 访问者模式的实例 访问者模式分析 引入访问者模式 Visitor是访问者的意思。数据结构中保存着元...

  • 第5章 -行为型模式-访问者模式

    一、访问者模式的简介 二、访问者模式的优缺点 三、访问者模式的实例

  • 访问者模式

    一、访问者模式介绍 二、访问者模式代码实例

  • [Android]设计模式-访问者模式

    [Android]设计模式-访问者模式 访问者模式 Visitor 【备注】只用于个人收藏

  • 行为型模式:访问者模式

    文章首发:行为型模式:访问者模式 十一大行为型模式之十一:访问者模式。 简介 姓名 :访问者模式英文名 :Visi...

  • 设计模式[23]-访问者模式-Visitor Pattern

    1.访问者模式简介 访问者模式(Visitor Pattern)模式是行为型(Behavioral)设计模式,提供...

  • 访问者模式

    《java与模式》中是这样描述访问者模式作用的: 访问者模式是对象的行为模式。访问者模式的目的是封装一些施加于某种...

  • C++11命令模式展示

    这个代码太简单了。命令模式一般会有一个std::vector对象来做命令的执行和回放,这里没体现出来。感觉课程的作...

  • C++11策略模式展示

    题目, 这个题目其实是在有理数范围内和无理数范围内分别计算求根公式的策略。对于有理数,不支持复数,那么如果求根公式...

网友评论

      本文标题:C++11访问者模式展示

      本文链接:https://www.haomeiwen.com/subject/mrkopltx.html