设计模式之外观模式

前言

对于一个比较老旧的模块时,或者需要多个模块才能组合成一个功能时,如果直接用旧模块或者用逐个调用分散的模块,会变得非常麻烦,旧系统的接口可能已经不适合当前系统,或者多个接口之间有比较复杂的依赖关系,对于调用者来讲,理清接口之间的头绪比较困难,这些接口间的关系对于调用者来说应该是透明的,所以在这种情况下,我们应该在中间加一层,来为使用者提供相对一致且清晰的高层接口。

外观模式

外观模式有点和代理模式相似,外观模式为其子系统的某一组接口提供一个一致的界面,定义了一个统一高层接口,这个接口使得这些子系统更容易被使用,用户无需关心每个子系统各自完成了什么功能。

设计模式之外观模式_第1张图片

  • 外观模式的优点:
  1. 提供统一的接口:外观模式为复杂系统提供一个简化的接口,使得客户端更容易使用系统。这样可以简化接口设计,提高系统的可用性和灵活性,并降低系统的耦合性。

  2. 降低耦合性:外观模式通过将子系统封装在一个外观类中,降低了系统各个组件之间的耦合性。这样,系统的变化对客户端的影响较小,提高了系统的灵活性和可维护性。

  3. 提高灵活性:外观模式使得修改系统变得更容易,因为客户端只需要与外观类交互,而不需要了解子系统的细节。这样,系统的变化对客户端的影响较小,提高了系统的灵活性和可维护性。

  4. 简化了调用者与各个子系统之间的交互:外观模式是通过引入一个外观角色来简化调用者与各个子系统之间的交互,为复杂的子系统调用提供一个统一的入口,降低子系统与调用者的耦合度,使得扩展更加方便。

  5. 良好的扩展性:外观模式把各个子系统和调用者解耦,扩展性会更好。比如,想要增加一个子系统时,只需要按照外观模式的规范进行开发,调用者和外观类都不用修改。

  • 然而,外观模式并不是万能的,它也有一些缺点。比如,如果设计不合理,增加新的子系统时可能需要修改外观类或调用者的源代码,这就违背了“开闭原则”。此外,如果外观类的设计不合理,可能会导致性能问题,因为外观类可能成为系统的瓶颈,影响系统的性能

示例

#ifndef DESIGN_MODE_H
#define DESIGN_MODE_H

#include 


class  SubSystemOne{

public:
    void methodOne(){
        printf("methodOne\n");
    }
};

class  SubSystemTwo{

public:
    void methodTwo(){
        printf("methodTwo\n");
    }
};

class  SubSystemThree{

public:
    void methodThree(){
        printf("methodThree\n");
    }
};

class  SubSystemFour{

public:
    void methodFour(){
        printf("methodFour\n");
    }
};


class Facade {
public:
    Facade(){
        m_sysOne = new SubSystemOne();
        m_sysTwo = new SubSystemTwo();
        m_sysThree = new SubSystemThree();
        m_sysFour = new SubSystemFour();
    }

    void FacadeMethodA(){
        m_sysOne->methodOne();
        m_sysThree->methodThree();
    }

    void FacadeMethodB(){
        m_sysTwo->methodTwo();
        m_sysFour->methodFour();
    }

private:
    SubSystemOne* m_sysOne;
    SubSystemTwo* m_sysTwo;
    SubSystemThree* m_sysThree;
    SubSystemFour* m_sysFour;

};

#endif

main.cpp

    Facade* fa = new Facade();
    fa->FacadeMethodA();
    fa->FacadeMethodB();

Facade有用四个子系统的实例,Facade的方法A调用子系统1和子系统3的方法,方法B调用子系统2和子系统4的方法。

使用场景

什么时候使用外观模式呢,这要分三个阶段来说:

  • 首先,在设计初期阶段,应该要有意识的将不同的两个层分离,比如经典的三层架构,就需要考虑在数据访问层和业务逻辑层、业务逻辑层和表示层的层与层之间建立外观Facade,这样可以为复杂的子系统提供一个简单的接口,使得耦合大大降低。
  • 其次,在开发阶段,子系统往往因为不断的重构演化而变得越来越复杂,大多数的模式使用时也都会产生很多很小的类,这本是好事,但也给外部调用它们的用户程序带来了使用上的困难,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖。
  • 第三,在维护一个遗留的大型系统时,可能这个系统已经非常难以维护和扩展了,但因为它包含非常重要的功能,新的需求开发必须要依赖于它。此时用外观模式Facade也是非常合适的。你可以为新系统开发一个外观Facade类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。


以上图片来源于程杰的《大话设计模式》,需要的同学可以关注公众号程序员DeRozan,回复1207领取。

《C++ Primer》《Effective C++》是C++开发者必不可少的书籍,如果你想入门C++,以及想要精进C++开发技术,这两本书可以说必须要有。此外,《Linux高性能服务器编程》以及《Linux多线程服务端编程:使用muduo C++网络库》.(陈硕)》是快速提高你的linux开发能力的秘籍。《大话设计模式》可以增强我们的模型提取及设计能力,写出更优雅的代码。同时,《操作系统导论》更是开发必读书目,在网上搜索相关资源也要花费一些力气,需要的同学可以关注公众号【程序员DeRozan】,回复【1207】快速免费领取~

你可能感兴趣的:(设计模式,设计模式,外观模式)