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

为子系统中的一组接口提供一个一致的界面,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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值