zoukankan      html  css  js  c++  java
  • [设计模式] 10 外观模式 facade

    外观模式应该是用的很多的一种模式,特别是当一个系统很复杂时,系统提供给客户的是一个简单的对外接口,而把里面复杂的结构都封装了起来。客户只需使用这些简单接口就能使用这个系统,而不需要关注内部复杂的结构。DP一书的定义:为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。举个编译器的例子,假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口,比如名为Compiler的类,里面有一个名为Run的函数。客户只需调用这个函数就可以编译程序,至于Run函数内部的具体操作,客户无需知道。下面给出UML图,以编译器为实例。

            相应的代码实现为:

    class Scanner
    {
    public:
        void Scan() { cout<<"词法分析"<<endl; }
    };
    class Parser
    {
    public:
        void Parse() { cout<<"语法分析"<<endl; }
    };
    class GenMidCode
    {
    public:
        void GenCode() { cout<<"产生中间代码"<<endl; }
    };
    class GenMachineCode
    {
    public:
        void GenCode() { cout<<"产生机器码"<<endl;}
    };
    //高层接口
    class Compiler
    {
    public:
        void Run() 
        {
            Scanner scanner;
            Parser parser;
            GenMidCode genMidCode;
            GenMachineCode genMacCode;
            scanner.Scan();
            parser.Parse();
            genMidCode.GenCode();
            genMacCode.GenCode();
        }
    };
    
    int main()
    {
        Compiler compiler;
        compiler.Run();
        return 0;
    }

    外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的程序员是最有体会的。visual studio提供的强大功能,只需要一个Build按钮,就可以进行Build动作,而不需要去写makefile文件,然后再去执行一些命令进行编译。

    Facade:知道哪些子系统类负责处理请求,并且将客户的请求代理给适当的子系统对象;

    SubSystem:实现子系统具体的功能;处理由Facade对象指派的任务;但是,SubSystem没有Facade的任何相关信息,也就是说,没有指向Facade的指针。

    Client通过发送请求给Facade的方式与子系统进行通信,而不直接与子系统打交道,Facade将这些消息转发给适当的子系统对象。尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口,这里是不是有点适配器模式的感觉呢?这就是学习结构型设计模式的感觉,感觉都很相似,但是仔细的去研究时,就会发现各自的用处。

  • 相关阅读:
    Java乐观锁与悲观锁介绍和CAS的实现方式以及jvm内存分配方式
    Java爬虫Ins博主所有帖子的点赞和评论导出excel
    移动端touch事件影响click事件以及在touchmove添加preventDefault导致页面无法滚动的解决方法
    Gulp的代理转发插件
    Mybatis学习笔记汇总(包括源码和jar包)
    HTTP Strict Transport Security (通常简称为HSTS)
    java项目部署Linux服务器几种启动方式总结经验
    Nginx下的location,upstream,rewrite 和 proxy_pass使用总计大全
    SQL注入和Mybatis预编译防止SQL注入
    area.json
  • 原文地址:https://www.cnblogs.com/diegodu/p/4450947.html
Copyright © 2011-2022 走看看