现在的位置: 首页 > 综合 > 正文

设计模式中结构型模式(五)外观模式(Facade)

2017年12月07日 ⁄ 综合 ⁄ 共 2420字 ⁄ 字号 评论关闭

为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更容易使用。将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标浊使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。在遇到以下情况使用Facade模式1、当你要为一个复杂子系统提供一个简单接口时。2、客户程序与抽象类的实现部分之间存在着很大的依赖性。3、当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。Facade模式有下面的一些优点:

1、它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

2、它实现了子系统与客户之间的松藕合关系,而子系统内部的功能组件往往是紧藕合的。

3、如果应用需要,它并不限制它们使用子系统类。

 以下为部分代码(待补全)

 

// Facade.h: interface for the Facade class.
//
//////////////////////////////////////////////////////////////////////
#pragma once

#include 
"../TestBasicClass/BasicClass.h"
class ProgramNode
{
public:
    
//program node manipulation
    virtual void GetSourcePosition(int& line, int& index);

    
//child manipulation
    virtual void Add(ProgramNode*);
    
virtual void Remove(ProgramNode* );

    
virtual void Traverse(CodeGenerator&);
protected:
    ProgramNode();

}
;

class ProgramNodeBuilder
{
public:
    ProgramNodeBuilder();

    
virtual ProgramNode* NewVarible(const char* variableName) const;

    
virtual ProgramNode* NewAssignment(ProgramNode* variable,
        ProgramNode
* expression) const;

    
virtual ProgramNode* NewReturnStatement(ProgramNode* value) const;

    
virtual ProgramNode* NewCondition(
        ProgramNode
* condition,
        ProgramNode
* truePart, ProgramNode* falsePart) const;

    ProgramNode
* GetRootNode();
private:
    ProgramNode
* _node;
}
;


class Scanner
{
public:
    Scanner(istream
& );
    
virtual ~Scanner();

    
virtual Token& Scan();
private:
    istream
& _inputStream;
}
;

class Parser
{
public:
    Parser();
    
virtual ~Parser();

    
virtual void Parser(Scanner&, ProgramNodeBuilder& );
}
;

class CodeGenerator
{
public:
    
virtual void Visit(StatementNode*);
    
virtual void Visit(ExpressionNode*);

protected:
    CodeGenerator(BytecodeStream
&);
protected:
    BytecodeStream
& _output;
}
;

void ExpressionNode::Traverse(CodeGenerator& cg)
{
    cg.Visit(
this);

    ListIterator
<ProgramNode*> i(_children);

    
for( i.First(); !i.IsDone(); i.Next())
    
{
        i.CurrentItem()
->Traverse(cg);
    }

}



class Compiler
{
public:
    Compiler();
    
virtual void Compiler(istream&, BytecodeStream&);
}
;

void Compiler::Compiler(istream& input, BytecodeStream& output)
{
    Scanner scanner(input);
    ProgramNodeBuilder builder;
    Parser parser;

    parser.Parser(scanner, builder);

    RISCCodeGenerator generator(output);
    ProgramNode
* parseTree = builder.GetRootNode();
    parseTree
->Traverse(generator);
}

抱歉!评论已关闭.