0. 简介

外观模式作为我们常用结构模式的最后一节,一些不常用的比如说桥接、享元、代理等,这里等有时间在补充学习吧。下面我将会来继创建模式和结构模式后来讲行为模式。

外观模式是一种结构型设计模式, 能为程序库、 框架或其他复杂类提供一个简单的接口。外观模式(Facade)为子系统中的一组接口提供了一个一致的界面,此模式定义了一个高层接口,这些接口使得这一子系统更加容易使用. 其基本的结构体大致如下:
在这里插入图片描述

1. 外观模式示意图

在这里插入图片描述
Facade类(外观类):对外提供一个高层接口,将客户的请求交给适当子系统进行处理

SubSystem Classees: 是子系统类的集合,每个子系统都完成一个特定的功能,这些子系统可以是某个模块,也可是某些类,Facade类将用户的请求交给这些子系统进行处理;需要注意的是子类中没有Facade类的任何信息,即没有对Facade类对象的引用;

2. 示例程序

外观函数的示例函数很简单,其实就是对多个函数进行封装调用,其形式和生成器的主管 (Director) 类似。可以通过使用简单接口, 但将绝大部分工作委派给其他类的类来识别。 通常情况下, 外观管理其所使用的对象的完整生命周期。

#include<iostream>
using namespace std;

class Sub_Work1//子工作1
{
public:
    void Working1()
    {
        cout<<"Doing Sub-Work1..."<<endl;
    }
};

class Sub_Work2//子工作2
{
public:
    void Working2()
    {
        cout<<"Doing Sub-Work2..."<<endl;
    }
};

class Sub_Work3//子工作3
{
public:
    void Working3()
    {
        cout<<"Doing Sub-Work3..."<<endl;
    }
};

class Sub_Work4//子工作4
{
public:
    void Working4()
    {
        cout<<"Doing Sub-Work4..."<<endl;
    }
};
class Work//总工作,客户与之打交道
{
private:
    Sub_Work1 w1;
    Sub_Work2 w2;
    Sub_Work3 w3;
    Sub_Work4 w4;
public:
    void Work1()//总工作1
    {
        w1.Working1();
        w3.Working3();
    }
    void Work2()//总工作2
    {
        w2.Working2();
        w3.Working3();
        w4.Working4();
    }
};


int main()//client程序
{
    Work w;
    /*******总工作1******/
    cout<<"开始调用总工作1"<<endl;
    w.Work1();

    /*******总工作2******/
    cout<<endl<<"开始调用总工作2"<<endl;
    w.Work2();
    return 0;
}

3. 外观模式的优缺点

在设计初期阶段,应该有意识的将不同的两个层分离或者系统模块化,比如经典的三层架构,就需要在考虑数据访问层和业务逻辑层、业务逻辑层和表示层的层和层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合性大大降低.

在开发阶,由于子系统的不断重构演变而变的越来越复杂,客户端程序调用子系统变得困难,此时可以引入外观类可以将子系统与客户端解耦,从而提高子系统的独立性和可移植性。

在维护一个遗留的大型系统时,可以能这个系统已经非常难以维护和扩展了,但因为包含非常重要的功能,新的需求必须依赖它。此时使用外观模式也是非常适合的。我们为新系统开发一个Facade外观类,让新系统与Facade对象交互,Facade对象与遗留代码交互完成所有复杂的工作

在这里插入图片描述
外观模式为现有对象定义了一个新接口, 适配器模式则会试图运用已有的接口。 适配器通常只封装一个对象, 外观通常会作用于整个对象子系统上。

当只需对客户端代码隐藏子系统创建对象的方式时, 你可以使用抽象工厂模式来代替外观

外观类通常可以转换为单例模式类, 因为在大部分情况下一个外观对象就足够了
在这里插入图片描述

4. 参考链接

https://www.cnblogs.com/wzxNote/p/12718427.html

https://refactoringguru.cn/design-patterns/facade

https://blog.csdn.net/c_base_jin/article/details/78011229