设计模式 --> (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
原文地址:https://www.cnblogs.com/jeakeven/p/4948090.html