`

[行为型模式] 解释器模式的理解

 
阅读更多



头文件
//InterpreterPattern.h

#ifndef INTERPRETER_PATTERN_H
#define INTERPRETER_PATTERN_H

#include <Windows.h>
#include <iostream>
#include <map>
#include <string>
using namespace std;

namespace InterpreterPattern
{
    //////////////////////////////////////////////////////////////////////////
    class Context
    {
    private:
        map<string, int> m_cValueMap;

    public:
        void addValue(string key,int value);
        int getValue(string key);
    };

    //////////////////////////////////////////////////////////////////////////
    class AbstractExpression
    {
    public :
        virtual int interpreter(Context context) = 0;
    };

    //////////////////////////////////////////////////////////////////////////
    class AddNonterminalExpression : public AbstractExpression
    {
    private :
        AbstractExpression* m_pLeft;
        AbstractExpression* m_pRight;

    public:
        AddNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    class SubtractNonterminalExpression : public AbstractExpression
    {
    private :
        AbstractExpression* m_pLeft;
        AbstractExpression* m_pRight;

    public:
        SubtractNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    class TerminalExpression : public AbstractExpression
    {
    private :
        int i;

    public :
        TerminalExpression(int i);
        int interpreter(Context cContext);
    };

    //////////////////////////////////////////////////////////////////////////
    void InterpreterPattern_Test();
}

#endif


实现
#include "InterpreterPattern.h"

namespace InterpreterPattern
{
    //////////////////////////////////////////////////////////////////////////
    void Context::addValue(string key,int value)
    {
        m_cValueMap.insert(std::pair<string,int>(key,value));
    }

    int Context::getValue(string key)
    {
        return m_cValueMap[key];
    }

    //////////////////////////////////////////////////////////////////////////
    AddNonterminalExpression::AddNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight)
    {
        this->m_pLeft = pLeft;
        this->m_pRight = pRight;
    }

    int AddNonterminalExpression::interpreter(Context cContext)
    {
        return this->m_pLeft->interpreter(cContext) + this->m_pRight->interpreter(cContext);
    }

    //////////////////////////////////////////////////////////////////////////
    SubtractNonterminalExpression::SubtractNonterminalExpression(AbstractExpression* pLeft, AbstractExpression* pRight)
    {
        this->m_pLeft =  pLeft;
        this->m_pRight = pRight;
    }

    int SubtractNonterminalExpression::interpreter(Context cContext)
    {
        return this->m_pLeft->interpreter(cContext) - this->m_pRight->interpreter(cContext);
    }

    //////////////////////////////////////////////////////////////////////////
    TerminalExpression::TerminalExpression(int i)
    {
        this->i = i;
    }

    int TerminalExpression::interpreter(Context cContext)
    {
        return this->i;
    }

    //////////////////////////////////////////////////////////////////////////
    void InterpreterPattern_Test()
    {
        //a-b+c
        Context cContext;
        cContext.addValue("a", 7);
        cContext.addValue("b", 8);
        cContext.addValue("c", 2);

        SubtractNonterminalExpression* pSubtractValue = new SubtractNonterminalExpression(new TerminalExpression(
            cContext.getValue("a")), new TerminalExpression(cContext.getValue("b")));

        AddNonterminalExpression* pAddValue = new AddNonterminalExpression(pSubtractValue, new TerminalExpression(
            cContext.getValue("c")));

        cout<< pAddValue->interpreter(cContext);
    }
}


客户端
#include "InterpreterPattern.h"


#include <iostream>
using namespace std;
using namespace InterpreterPattern;

void main()
{
    InterpreterPattern_Test();
}

运行结果
分享到:
评论

相关推荐

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    解释器模式(Interpreter)原理图

    解释器模式(Interpreter Pattern)是一种行为型设计模式,它用于定义一个语言的文法,并解析语言中的表达式。具体来说,解释器模式通过定义一个解释器来解释语言中的表达式,从而实现对语言的解析和执行。 在解释...

    设计模式课件大全

    设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略模式、模板方法、访问者 此PPT实例便于理解,对于深入理解OO思想有很大帮助。

    java 23种设计模式及具体例子

    java 设计模式 java 设计模式是软件工程的基石,它们被反复使用、多数人知晓的、经过...* 解释器模式:解释器模式是一种行为型模式,它可以将对象之间的关系建立在解释者的基础上,以便于更好地实现对象之间的关系。

    设计模式 GOF 23

    5.3 INTERPRETER(解释器)—类行为型 模式 162 5.4 ITERATOR(迭代器)—对象行为型 模式 171 5.5 MEDIATOR(中介者)—对象行为型 模式 181 5.6 MEMENTO(备忘录)—对象行为型 模式 188 5.7 OBSERVER(观察者)—...

    设计模式:可复用面向对象软件的基础--详细书签版

    5.3 interpreter(解释器)—类行为型 模式 162 5.4 iterator(迭代器)—对象行为型 模式 171 5.5 mediator(中介者)—对象行为型 模式 181 5.6 memento(备忘录)—对象行为型 模式 188 5.7 observer...

    尚硅谷设计模式源码笔记课件.zip

    行为型模式:模版方法模式、命令模式、访问者模式、迭代器模式、观察者模式、中介者模式、备忘录模式、解释器模式(Interpreter模式)、状态模式、策略模式、职责链模式(责任链模式) 2) 学习目标:通过学习,学员...

    设计模式精解及面试攻略

    第6章阐释行为模式(职责链、命令、解释器、迭代器、中介者、备忘录、观察者、状态、策略、模板方法、访问者模式);第7章针对所有设计模式向初学者提供一些提示;第8章包括常见的面试问题及实际示例;第9章涵盖Java...

    设计模式Demo

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。 二、设计...

    java-design-patterns:Java 设计模式学习笔记

    将不同的功能代码解耦桥接模式装饰器模式适配器模式外观模式组合模式享元模式行为型模式(更新中...)作用:将不同的行为代码解耦观察者模式模板方法模式策略模式职责链模式状态模式迭代器模式访问者模式备忘录模式...

    java-patterns:Java 23种基本的设计模式整料整理学习,责任链模式过滤器,工厂模式BeanFactory,观察者模式ContextListen等。结合Spring源码理解学习

    行为类型模式,共十种:策略模式,模板方法模式,观察者模式,迭代子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式。 设计模式的六大原则 开闭原则(Open Close Principle)...

    DesignPattern:23种设计模式,Android原始设计模式分析-android

    继承子模式,责任链模式,命令模式,注释模式,状态模式,访问者模式,中介者模式,解释器模式GitHub托管请读者点击明星进行关注并支持!在线阅读目录关注我对于一个开发者而言,能够胜任系统中任意一个模块的开发是...

    Java的23种设计模式疯狂Java总结.doc

    设计模式3 1.1 创立型模式4 1.1.1 工厂方法4 1.1.2 抽象工厂6 1.1.3 建造...行为型模式37 1.3.1 责任链模式37 1.3.2 命令模式40 1.3.3 解释器模式43 1.3.4 迭代器模式45 1.3.5 中介者模式49 1.3.6 备忘录模式52 1.3.7 ...

    java餐饮管理系统源码-pattern:设计模式扫盲,以身边故事来讲解设计模式

    解释器模式 写在前面: UML图解 继承和实现是比较容易理解的两种类关系。在架构设计中,要注意组合、聚合和 依赖这三者的区别。 组合在 语中的含义是把若干个独立部分组成整体 各个部分都有其 立的使用 价值和生命...

    百度地图开发java源码-DesignPatterns:要深刻理解开源代码,必先掌握丰富的设计模式

    百度地图开发java源码 ...解释器模式(Interpreter) 3.4 迭代器模式(Iterator) 3.5 中介者模式(Mediator) 3.6 备忘录模式(Memento) 3.7 观察者模式(Observer) 3.8 状态模式(State) 3.9 策略模式(Stra

    java-design-patterns:java 学习模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 设计模式之UML 类图以及类间关系(泛化 、实现、依赖...

    飞嘀出行java源码-Java-DesignPattern:Java设计模式

    行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。 其实还有两类:并发型模式和线程池模式。用一个图片...

Global site tag (gtag.js) - Google Analytics