13.外观模式--Facade

来源:互联网 发布:安装软件用什么软件源 编辑:程序博客网 时间:2024/05/16 12:17

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

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

Facade模式典型的结构图为:
 

以投资股票为例,股民需要了解想购买的所有股票,那么众多的投资者和众多的个股联系太多,即要了解相关个股,又不够专业,而如果投资基金的话,具体是买股票还是债券还是外汇等就不需要关心了,基金经理给你打理好了一切,只需关注基金的盈亏就行了。而这个基金就是Façade。因此,股民买个股可以设计为:一个“股票”基类,然后是继承“股票”的“个股A”,“个股B”,“个股n”,股民需要操作每只股票的接口“买”和“卖”。而股民买个股的设计就变为了:股民直接操作“基金”类的接口,由“基金”去操作个股的“买”,“卖”,债券的“买”,“卖”,…。

下面是Façade的实现代码:
//Facade.h
#ifndef _FACADE_H_
#define _FACADE_H_

// 股票1
class Stock1
{
public:
    Stock1();
    ~Stock1();
    void Operation();
protected:
private:
};

// 股票2
class Stock2
{
public:
    Stock2();
    ~Stock2();
    void Operation();
protected:
private:
};

// 国债
class NationalDebt
{
public:
    NationalDebt();
    ~NationalDebt();
    void Operation();
protected:
private:
};

// 基金
class Fund
{
public:
    Fund();
    ~Fund();
    void OperationWrapper();
protected:
private:
    Stock1* _stock1;
    Stock2* _stock2;
    NationalDebt* _subs2;
};
#endif //~_FACADE_H_


//Facade.cpp
#include "Facade.h"
#include <iostream>
using namespace std;

Stock1::Stock1()
{
}

Stock1::~Stock1()
{
}

void Stock1::Operation()
{
    cout<<"Stock1::Operation..买股票1"<<endl;
}

Stock2::Stock2()
{
}

Stock2::~Stock2()
{
}

void Stock2::Operation()
{
    cout<<"Stock2::Operation..买股票2"<<endl;
}

NationalDebt::NationalDebt()
{
}

NationalDebt::~NationalDebt()
{
}

void NationalDebt::Operation()
{
    cout<<"NationalDebt::Operation..买国债"<<endl;
}

Fund::Fund()
{
    this->_stock1 = new Stock1();
    this->_stock2 = new Stock2();
    this->_subs2 = new NationalDebt();
}

Fund::~Fund()
{
    delete _stock1;
    delete _stock2;
    delete _subs2;
}

void Fund::OperationWrapper()
{
    this->_stock1->Operation();
    this->_stock2->Operation();
    this->_subs2->Operation();
}


//main.cpp
#include "Facade.h"
#include <iostream>
using namespace std;

int main(int argc,char* argv[])
{
    // 基金
    Fund* f = new Fund();

    // 操作基金
    f->OperationWrapper();

    return 0;
}

 

原创粉丝点击