设计模式(10) 外观模式(FACADE)(一)

2014-11-24 02:50:38 · 作者: · 浏览: 3
问题聚焦: 设计一个系统时,比较常见的做法是将它划分为若干个小的系统,互相协作,组成一个大的系统。 那么,在设计这些小系统时,需要注意一些什么呢? 外观模式为什么可以让子系统更加容易的使用呢?(最小化子系统之间的通信和相互依赖关系,即降低耦合度)

意图: 为子系统中的一组接口提供一个一致的界面。Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。
动机: 将一个系统划分为若干个子系统有利于降低系统的复杂性。 一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小。 达到该目标的途径之一就是引入一个外观对象,它为子系统中较一般的设施提供了一个单一而简单的界面。 其思想如下图所示: \ \ Demo:以编译器子系统的设计为例,说明外观模式的思想: 子系统类划分:Scanner, Parser, ProgramNode, BytecodeStream, ProgramNodeBuilder 要求:对普通用户提供一个高层的,单一而简单的编译子系统接口 对高级专业的用户提供底层功能,可以直接访问具体的子系统类。 设计: \ Compiler类(关键),其职责为两点: 1)为用户屏蔽子系统,提供一个高层的简单的使用接口; 2)不完全隐藏实现编译功能的那些子系统类,使得少数懂的如何使用底层功能的人可以调用这些功能。
适用性: 在遇到以下情况使用Facade模式:
  • 为一个复杂子系统提供一个简单接口。
  • 客户程序与抽象类的实现部分之间存在很大的依赖性。
  • 当你需要构件一个层次结构的子系统时,使用facade模式定义子系统中每层的入口点。如果子系统之间是相互依赖的,可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。 结构: \ vc/QobXEseS7r8v50OjSqrXE1tix4NLruaTX9wo8bGk+09DA+9PavPK7r8+1zbPU2rK7zazGvcyo1q685LXE0sbWsrn9s8w8bGk+yOe5+9Om08PQ6NKqo6zL/LKisrvP3tbGy/zDx8q508PX08+1zbPA4KGj0vK0y8Tjv8nS1NTaz7XNs9LX08PQ1LrNzajTw9DU1q685LzT0tTRodTxoaMKCgo8aHI+Cjxicj4KCsq1z9ajugoKPHVsPgo8bGk+vbW1zb/Nu6ct19PPtc2z1q685LXE8e66z7bIo7rBvdbWt73KvQo8dWw+CjxsaT4gICAg08Oz6c/zwODKtc/WRmFjYWRltvjL/LXEvt/M5dfTwOC21NOmsrvNrLXE19PPtc2zyrXP1qOs1eK/ydLUvfjSu7K9vbW1zb/Nu6fT69fTz7XNs7XE8e66z7bIPGxpPiAgICDTw7K7zay1xNfTz7XNs7bUz/PF5NbDRmFjYWRlo6y99tDo0qq21Mv8tcTX08+1zbO21M/zvfjQ0Mzmu7u8tL/JCjxsaT65q7my19PPtc2zwODT68u909DX08+1zbPA4KO6Cjx1bD4KPGxpPiAgICDTw8DgtcTLvM/ry7y/vNfTz7XNs6O60ru49tfTz7XNs9Pr0ru49sDgtcTP4CYjMjAyODQ71q60psrHo6zL/MPHtrzT0L3Tv9qyosfSy/zDx7a8t+LXsMHL0rvQqbarzvehqqGqwOC34tewwcvXtMysus2y2df3o6y2+NfTz7XNs7fi17DBy9K70KnA4KGjPGxpPiAgICDX08+1zbO1xLmrubK907/asPy6rMv509C1xL/Nu6ezzNDyv8nS1LfDzsq1xMDgPGxpPiAgICDX08+1zbO1xMu909C907/avfbTw9PattTX08+1zbO9+NDQwKmz5LrNzqy7pDxsaT4gICAgRmFjYWRlwODKx7mrubK907/atcTSu7K/t9ajrLWry/yyu8rHzqjSu7XEsr+31qOs19PPtc2ztcTG5Mv7sr+31s2os6PSssrHuau5srXECgq0+sLryr7A/aO6CgrS1MnPw+bL+czhtb21xLHg0uvG99fTz7XNs86qwP2howrA4MnotqijugoKQnl0ZWNvZGVTdHJlYW3A4KOsyrXP1sHL0ru49kJ5dGVjb2RlttTP88H3oaMKQnl0ZWNvZGW21M/zt+LXsMHL0ru49tfWvdrC66Os1eK49tfWvdrC67/J08PT2ta4tqi7+sb31rjB7qGjClRva2VuwOCjrLfi17DBy7Hgs8zT79HU1tC1xLHqyra3+wpTY2FubmVywOCjrL3TytXX1rf7wfeyorL6yfrSu7j2serKtrf7wfejrNK7tM6y+sn60ru49rHqyra3+6OodG9rZW6jqaGjCjxwcmUgY2xhc3M9"brush:java;">
    class Scanner { public: Scanner(istream&); virtual ~Scanner(); virtual Token& Scan(); private: istream& _inputStream; }; Parser:Parser类由Scanner生成的标识符构件一棵语法分析树。
    class Parser
    {
    public:
        Parser();
        virtual ~Parser();
    
        virtual void Parse(Scanner&, ProgramNodeBuilder&);
    };
    ProgramNodeBuilder:建立语法树,遵循Builder模式的交互式操作。
    class ProgramNodeBuilder
    {
    public:
        ProgramNodeBuilder();
    
        virtual ProgramNode* NewVariable (
             const char* variableName
         ) const;
    
        virtual ProgramNode* NewAssignment (
            ProgramNode* variable, ProgramNode* expression
        ) const;
    
        virtual ProgramNode* NewRetrurnStatement (
            ProgramNode* value
        ) const;
    
        virtual ProgramNode* NewCondition (
            ProgramNode* condition, 
            ProgramNode* truePart, 
            ProgramNode* falsePart
        ) const;
    
        ProgramNode* _node;
    
    private:
        ProgramNode* _node;
    };
    ProgramNode:语法树由ProgramNode子类(StatementNode和ExpressionNode)的实例构成,定义了一个接口用于操作程序节点和它的子节点。ProgramNode层次结构是组合模式(Composite)的一个应用实例。
    class Pr