为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更容易使用。将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标浊使子系统间的通信和相互依赖关系达到最小。达到该目标的途径之一是就是引入一个外观(facade)对象,它为子系统中较一般的设施提供了一个单一而简单的界面。在遇到以下情况使用Facade模式1、当你要为一个复杂子系统提供一个简单接口时。2、客户程序与抽象类的实现部分之间存在着很大的依赖性。3、当你需要构建一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。Facade模式有下面的一些优点:
1、它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。
2、它实现了子系统与客户之间的松藕合关系,而子系统内部的功能组件往往是紧藕合的。
3、如果应用需要,它并不限制它们使用子系统类。
以下为部分代码(待补全)
//
Facade.h:interfacefortheFacadeclass.
//
///////////////////////////////////////////////////////////////////// /
#pragma once
#include " ../TestBasicClass/BasicClass.h "
class ProgramNode
{
public :
// programnodemanipulation
virtual void GetSourcePosition( int & line, int & index);
// childmanipulation
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)
{
Scannerscanner(input);
ProgramNodeBuilderbuilder;
Parserparser;
parser.Parser(scanner,builder);
RISCCodeGeneratorgenerator(output);
ProgramNode * parseTree = builder.GetRootNode();
parseTree -> Traverse(generator);
}
//
///////////////////////////////////////////////////////////////////// /
#pragma once
#include " ../TestBasicClass/BasicClass.h "
class ProgramNode
{
public :
// programnodemanipulation
virtual void GetSourcePosition( int & line, int & index);
// childmanipulation
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)
{
Scannerscanner(input);
ProgramNodeBuilderbuilder;
Parserparser;
parser.Parser(scanner,builder);
RISCCodeGeneratorgenerator(output);
ProgramNode * parseTree = builder.GetRootNode();
parseTree -> Traverse(generator);
}