设计模式 笔记 外观模式 Facade


//---------------------------15/04/16----------------------------


//Facade 外观模式-----对象结构型模式


/*

    1:意图:

        为子系统的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得

        这一子系统更加容易使用。

    2:动机:

    3:适用性:

        1>当你要为一个复杂子系统提供一个简单接口时。  

            子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。

            这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子

            系统的用户带来使用上的困难。Facade可以提供一些简单的接口,这些接口对大多数

            用户来说是够用的,而那些需要更多可定制性的用户可以不管facade层,直接使用原来的子系统。

        2>客户程序与抽象类的实现部分之间存在着很大的依赖性。引入facade将这个子系统与客户以及

          其他的子系统分离,可以提高子系统的独立性和可移植性。

        3>当你需要构建一个层次结构的子系统时,使用Facade模式定义子系统中每层的入口点,如果子系统

          之间是相互依赖的,你可以让它们仅通过facade进行通讯,从而简化了它们之间的依赖关系。

    4:结构:

        并不能画,图在设计模式书上130页。

    5:参与者:

        1>Facade

            1)知道哪些子系统负责处理请求。

            2)将客户的请求代理给适当的子系统对象。

        2>Subsystem classes

            1)实现子系统的功能。

            2)处理由Facade对象指派的任务。

            3)没有facade的任何相关信息;即没有指向facade的指针。

    6:协作:

        1>客户程序通过发送请求给Facade的方式与子系统通讯,Facade将这些消息转发给适当的子系统

          对象。尽管是子系统中的有关对象在做实际工作,但是Facade模式本身也必须将它的接口转换

          成子系统的接口(接口设计得和子系统一样)

        2>使用Facade的客户程序不需要直接访问子系统对象。

    7:效果:

        1>它对客户屏蔽子系统组件,因而减少了客户处理的对象的数目并使得子系统使用起来更加方便。

        2>它实现了子系统与客户之间的松耦合关系,而子系统内部的功能组件往往是紧耦合的。松耦合

          关系使得子系统的组件变化不会影响到客户。Facade模式有助于建立层次结构系统,也有助于

          对对象之间的依赖关系分层。Facade模式可以消除复杂的循环依赖关系。

          Facade可以降低编译依赖性。

        3>如果应用需要,它并不限制它们使用子系统类。因此可以在易用性和通用性之间加以选择。

    8:实现:

        1>降低客户-子系统之间的耦合度。

            1)用抽象类实现Facade而它的具体子类对应不同的子系统实现,这可以进一步降低客户与子系统

              之间的耦合度。

            2)用不同的子系统对象配置Facade对象。为它定制facade,仅需对它的子系统对象进行替换

              即可。

        2>公共子系统类与私有子系统类。一个子系统与一个类的相似之处是:它们都有接口并且它们都封装

          了一些东西--类封装了状态和操作,而子系统封装了一些类。所以要考虑子系统的公共和私有接口。

          可以通过命名空间的办法仅暴露公告子系统类。

    9:代码示例:                                                                     */


//子系统中的类,功能:接受字符流,产生字标识符流。

class Scanner

{

public:

    Scanner(istream&);

    virtual ~Scanner();

    virtual Token& Scan();

private:

    istream& _inputStream;

};


//子系统中的类,功能:通过Scanner生成的标识符流,使用ProgramNodeBuilder创建一棵语法分析树

class Parser

{

public:

    Parser();

    virtual ~Parser();

    

    virtual void Parse(Scanner&, ProgramNodeBuilder&);

};



//子系统中的类,功能:builder模式下的conceretebuilder

class ProgramNodeBuilder

{

public:

    virtual ProgramNode* NewVariable(const char* variableName) const;

    virtual ProgramNode* NewAssignment(ProgramNode* variable,

                                       ProgramNode* expression) const;

    virtual ProgramNode* NewReturnStatment(ProgramNode* value) const;

    virtual ProgramNode* NewCondition(ProgramNode* condition,

                                      ProgramNode* truePart,

                                      ProgramNode* falsePart) const;

    ...

    ProgramNode* GetRootNode();

    

private:

    ProgramNode* _node;

};


//子系统中的类,功能:builder模式下的abstract product

class ProgramNode

{

public:

    virtual void GetSourcePosition(int& line, int& index);

    ...

    

    //child manipulation

    virtual void Add(ProgramNode*);

    virtual void Remove(ProgramNode*);

    ...

    

    virtual void Traverse(CodeGenerator&);

    

protected:

    ProgramNode();

};


//子系统中的类,功能:这是个接口,通过子类来实现具体的操作:为不同的硬件体系结构生产机器代码

class CodeGenerator

{

public:

    virtual void Visit(StatementNode*);

    virtual void Visit(ExpressionNode*);

    ...

    

protected:

    CodeGenerator(BytecodeStream&);

    

protected:

    BytecodeStream& _output;

};

//ExpressionNode子系统中的类,功能:builder模式下的concrete product

//下面是Traverse(函数)的具体实现

void ExpressionNode::Traverse(CodeGenerator* cg)

{

    cg.Visit(this);

    

    ListIterator<ProgramNode*> i(_children);

    

    for(i.First(); !i.IsDone(); i.Next())

    {

        i.CurrentItem()->Traverse(cg);

    }

}

//终于结束了!! 上面的类全部属于Subsystem classes

//下面这就是Facade模式中的Facade类了

class Compiler

{

public:

    Compiler();

    

    virtual void Compile(istream&, BytecodeStream&);

};


//封装了子系统类中的操作。

void Compiler::Compile(istream& input, BytecodeStream& output)

{

    Scanner scanner(input);

    ProgramNodeBuilder builder;

    Parser parser;

    

    parser.Parse(scanner, builder);

    

    RISCCodeGenerator generator(output);

    ProgramNode* parseTree = builder.GetRootNode();

    parseTree->Traverse(generator);

}


//这个模式就和使用函数一样,在C中当代码太多函数太多我们就需要使用函数来整理,把功能分类

//这个模式就是把类整理起来,使用这些类整合出必要的接口(功能)




原文地址:https://www.cnblogs.com/boydfd/p/4983134.html