为一套子系统提供一个统一的界面(Facade)

Design Patterns 10: Facade

#include <iostream>

struct BytecodeStream {};

struct Scanner
{
    Scanner(std::istream& input) : _inputStream(input) {}
    virtual ~Scanner() = default;
private:
    std::istream& _inputStream;
};

struct ProgramNodeBuilder;
struct Parser
{
    Parser() = default;
    virtual ~Parser() = default;
    virtual void Parse(Scanner&, ProgramNodeBuilder&) {}
};

struct ProgramNode;
//Visitor pattern
struct CodeGenerator
{
    virtual void Visit(ProgramNode*) {}
    CodeGenerator(BytecodeStream& output) : _output(output) {}
private:
    BytecodeStream& _output;
};

//Composite pattern
struct ProgramNode
{
    virtual void Add(ProgramNode*) {}
    virtual void Remove(ProgramNode*) {}
    virtual void Traverse(CodeGenerator&) {}
};

//Builder pattern
struct ProgramNodeBuilder
{
    ProgramNodeBuilder() = default;

};

struct Compiler
{
    Compiler() = default;
    virtual void Compile(std::istream& input, BytecodeStream& output)
    {
        Scanner scanner(input);
        ProgramNodeBuilder builder;
        Parser parser;
        parser.Parse(scanner, builder);
        CodeGenerator generator(output);
    }
};

int main()
{
    BytecodeStream output;
    Compiler compiler;
    compiler.Compile(std::cin, output);
}

 

相关文章: