首页 > 代码库 > 外观(Facade)模式

外观(Facade)模式

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

在软件开发中,有时候为了完成一项较为复杂的功能,一个客户类需要和多个业务类交互,而这些需要交互的业务类经常会作为一个整体出现,由于涉及到的类比较多,导致使用时代码较为复杂,此时,特别需要一个类似电脑组装公司一样的角色,由它来负责和多个业务类进行交互,而客户类只需与该类交互。外观模式通过引入一个新的外观类(Facade)来实现该功能,外观类充当了软件系统中的“电脑组装公司”,它为多个业务类的调用提供了一个统一的入口,简化了类与类之间的交互。在外观模式中,那些需要交互的业务类被称为子系统(Subsystem)。如果没有外观类,那么每个客户类需要和多个子系统之间进行复杂的交互,系统的耦合度将很大,而引入外观类之后,客户类只需要直接与外观类交互,客户类与子系统之间原有的复杂引用关系由外观类来实现,从而降低了系统的耦合度

在开发阶段,子系统往往因为不断地重构演化而变得越来越复杂,使用外观模式可以提供一个简单的接口,减少它们之间的依赖。  在维护一个大型系统时,可能这个系统已经非常难以维护了和扩展了,我们可以为这个系统增加一个外观Facade类,来提供遗留代码的比较清晰的接口,让新系统与Facade对象交互,Facade则与遗留代码进行交互。

代码:

#include <iostream>
using namespace std;

class Shopper
{
public:
    void shop()
    {
        cout << "买菜" << endl;
    }
};

class Cook
{
public:
    void cook()
    {
        cout << "做饭" << endl;
    }
};

class DishWasher
{
public:
    void washDish()
    {
        cout << "洗碗" << endl;
    }
};

class Restaurant
{
public:
    void makemeal()
    {
        _shopper.shop();
        _cook.cook();
        _dishwasher.washDish();
    }
private:
    Shopper _shopper;
    Cook _cook;
    DishWasher _dishwasher;
};

void test()
{
    Restaurant rs;
    rs.makemeal();
}

int main()
{
    test();
    cin.get();
    return 0;
}

 

外观(Facade)模式