为子系统中的一组接口提供一个一致的界面,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);
}
//
/**///////////////////////////////////////////////////////////////////////
#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);
}