zoukankan      html  css  js  c++  java
  • 设计模式 --> (7)外观模式

    外观模式

      外观模式为子系统中的一组接口提供一个一致的界面, 外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

    适用性

      1.为一个复杂子系统提供一个简单接口。

      2.提高子系统的独立性。

      3.在层次化结构中,可以使用Facade模式定义系统中每一层的入口。

    代码示例

      假设编译一个程序需要经过四个步骤:词法分析、语法分析、中间代码生成、机器码生成。学过编译都知道,每一步都很复杂。对于编译器这个系统,就可以使用外观模式。可以定义一个高层接口,比如名为Compiler的类,里面有一个名为Run的函数。客户只需调用这个函数就可以编译程序,至于Run函数内部的具体操作,客户无需知道。

    #include <iostream>
    using namespace std;
    
    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;  
    }  

    代码示例2

      构造一个家庭影院,当启动watchMovie方法时可以看电影,当使用endMovie时关闭电影。

    #include <iostream>
    using namespace std;
    
    //组件类
    class Amplifier
    {
    public:
        void on()
        {
            cout << "Amplifier on" << endl;
        }
    
        void off()
        {
            cout << "Amplifier off" << endl;
        }
    };
    
    class Tuner
    {
    public:
        void on()
        {
            cout << "Tuner on" << endl;
        }
    
        void off()
        {
            cout << "Tuner off" << endl;
        }
    };
    
    class DvdPlayer
    {
    public:
        void on()
        {
            cout << "DvdPlayer on" << endl;
        }
    
        void off()
        {
            cout << "DvdPlayer off" << endl;
        }
    };
    
    class Screen
    {
    public:
        void on()
        {
            cout << "Screen on" << endl;
        }
    
        void off()
        {
            cout << "Screen off" << endl;
        }
    };
    
    //家庭影院
    class HomeTheaterFacade
    {
    public:
        //统一接口
        void watchMovie()
        {
            amp.on();
            tuner.on();
            dvd.on();
            screen.on();
        }
    
        void endMovie()
        {
            amp.off();
            tuner.off();
            dvd.off();
            screen.off();
        }
        
        HomeTheaterFacade(Amplifier am,
        Tuner tune,
        DvdPlayer dv,
        Screen scree)
        {
            amp = am;
            tuner = tune;
            dvd = dv;
            screen = scree;
        }
        //~HomeTheaterFacade(){}
    private:
        Amplifier amp;
        Tuner tuner;
        DvdPlayer dvd;
        Screen screen;
    };
    
    //客户代码
    int main()
    {
        Amplifier amp;
        Tuner tuner;
        DvdPlayer dvd;
        Screen screen;
    
        HomeTheaterFacade homeTheaterFacade(amp,tuner,dvd,screen);;
        homeTheaterFacade.watchMovie();
        homeTheaterFacade.endMovie();
        return 0;
    }

    结果:

    Amplifier on
    Tuner on
    DvdPlayer on
    Screen on
    Amplifier off
    Tuner off
    DvdPlayer off
    Screen off
  • 相关阅读:
    java中<> 的用法
    Java 中 compareTo方法问题
    class AClass<E extends Comparable>与class AClass<E extends Comaprable<E>>有什么区别?
    zookeeper常用命令
    Storm概念讲解和工作原理介绍
    Storm集群安装部署步骤【详细版】
    Error contacting service. It is probably not running.
    Exception in thread "main" expected '<document start>', but found BlockMappingStart in 'reader', line 23, column 2: nimbus.host: "master"
    zookeeper 启动失败 BindException: Address already in use 或者Error contacting service. It is probably not running
    scss的安装使用
  • 原文地址:https://www.cnblogs.com/jeakeven/p/4948090.html
Copyright © 2011-2022 走看看