zoukankan      html  css  js  c++  java
  • 设计模式 笔记 外观模式 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中当代码太多函数太多我们就需要使用函数来整理,把功能分类

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




  • 相关阅读:
    二进制求和
    删除排序数组中的重复项--leetcode算法题
    vue render
    数字实现千分位分隔符
    用nodejs实现向文件的固定位置插入内容
    工作中用到的正则表达式
    组件toast(类似于element-ui的message组件)的实现
    用svg实现一个环形进度条
    批量删除当前文件夹下面的.svn文件夹
    windows下的包管理器scoop
  • 原文地址:https://www.cnblogs.com/boydfd/p/4983134.html
Copyright © 2011-2022 走看看