预览加载中,请您耐心等待几秒...
1/4
2/4
3/4
4/4

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

为子系统中的一组接口提供统一的接口,外观模式提供了一个更高层的接口,使得子系统比较容易使用。 Provideaunifiedinterfacetoasetofinterfacesinasubsystem.Facadedefinesahigher-levelinterfacethatmakesthesubsystemeasier touse. Facade应该是比较简单模式,只有两个参与者Facade和subsystemclasses。 Facade的主要功能是降耦,将subsystems封装成统一的接口,如此客户端只需要与Facade交互即可,无需关心子系统之间的依赖关系。 通过以下例子,了解一下编译器的设计是如何使用Facade模式的。 首先编译器子系统定义了一个ByteCodeStream类,实现了ByteCode对象流。一个ByteCode对象封装了一个字节码,字节码指定了机器指令。为了表示编程语言中的操作符,子系统也定义了一个Token类。 Scanner类使用字符流并生产标志符流,一次产生一个标志符。 classScanner{ public: Scanner(istream&); virtual~Scanner(); virtualToken&Scan(); private: istream&_inputStream; }; Parser使用ProgramNodeBuilder类,利用从Scanner得到的标志符来构建一个语法分析树(ParseTree)。 classParser{ public: Parser(); virtual~Parser(); virtualvoidParse(Scanner&,ProgramNodeBuilder&); }; Parser通过回调ProgramNodeBuilder来增量地创建语法分析树,这些类利用了Builder模式来交互。 classProgramNodeBuilder{ public: ProgramNodeBuilder(); virtualProgramNode*NewVariable( constchar*variableName )const; virtualProgramNode*NewAssignment( ProgramNode*variable,ProgramNode*expression )const; virtualProgramNode*NewReturnStatement( ProgramNode*value )const; virtualProgramNode*NewCondition( ProgramNode*condition, ProgramNode*truePart,ProgramNode*falsePart )const; //... ProgramNode*GetRootNode(); private: ProgramNode*_node; }; 语法分析树是由ProgramNode子类的实例构成的,比如StatementNode,ExpressionNode等等。ProgramNode的结构就是Composite模式的实例。ProgramNode定义了一个接口用来控制程序节点以及它的子节点。 classProgramNode{ public: //programnodemanipulation virtualvoidGetSourcePosition(int&line,int&index); //... //childmanipulation virtualvoidAdd(ProgramNode*); virtualvoidRemove(ProgramNode*); //... virtualvoidTraverse(CodeGenerator&); protecte(参考:http://www.linbayan8.com)d: ProgramNode(); }Traverse操作付接收一个CodeGenerator对象。ProgramNode子类利用这个对象来生成BytecodeStream中的ByteCode形式的机器码。CodeGenerator类是一个Visitor模式。 classCodeGenerator{ public: virtualvoidVisit(StatementNode*); virtualvoidVisit(ExpressionNode*); //... protected: CodeGenerator(BytecodeStream&); protected: Bytecode