外观模式

设计理念

提供统一的接口,用来访问子系统中的一群接口。
外观模式有个最大的特点就是将细粒度的对象包装成粗粒度的对象,一般通过访问这个外观对象,来完成细粒度对象的调用。
外观模式一般是分布式应用和系统架构中的应用服务层的设计中常用的方式,并且一般结合外观模式+DTO(Data Transfer Object,数据传输对象来完成服务层的设计,提供分布式应用服务的高效服务,外观模式我们可以这样理解,我们通过外观的包装,使应用程序只能看到外观对象,而不会看到具体的细节对象,这样无疑会降低应用程序的复杂度,并且提高了程序的可维护性。

引入外观角色之后,用户只需要直接与外观角色交互,用户与子系统之间的复杂关系由外观角色来实现,从而降低了系统的耦合度。
这里写图片描述

UML类图

外观模式

  • Facade: 外观角色,用于提供统一的接口;
  • SubSystem:子系统角色,需要维护的细粒度对象。

实现代码

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

int main(int argc, char *argv[])
{
    Facade fa;
    fa.wrapOpration();

    return 0;
}
///////////////////////////////////////////////////////////
//  Facade.h
//  Implementation of the Class Facade
///////////////////////////////////////////////////////////

#include "SystemC.h"
#include "SystemA.h"
#include "SystemB.h"

class Facade
{

public:
    Facade();
    virtual ~Facade();

    void wrapOpration();

private:
    SystemC *m_SystemC;
    SystemA *m_SystemA;
    SystemB *m_SystemB;
};
///////////////////////////////////////////////////////////
//  Facade.cpp
//  Implementation of the Class Facade
///////////////////////////////////////////////////////////

#include "Facade.h"


Facade::Facade(){
    m_SystemA  = new SystemA();
    m_SystemB = new SystemB();
    m_SystemC = new SystemC();
}



Facade::~Facade(){
    delete m_SystemA;
    delete m_SystemB;
    delete m_SystemC;
}

void Facade::wrapOpration(){
    m_SystemA->operationA();
    m_SystemB->operationB();
    m_SystemC->opeartionC();
}

总结

外观模式要求一个子系统的外部与其内部的通信通过一个统一的外观对象进行,外观类将客户端与子系统的内部复杂性分隔开,使得客户端只需要与外观对象打交道,而不需要与子系统内部的很多对象打交道。

主要优点在于对客户屏蔽子系统组件,减少了客户处理的对象数目并使得子系统使用起来更加容易,它实现了子系统与客户之间的松耦合关系,并降低了大型软件系统中的编译依赖性,简化了系统在不同平台之间的移植过程;其缺点在于不能很好地限制客户使用子系统类,而且在不引入抽象外观类的情况下,增加新的子系统可能需要修改外观类或客户端的源代码,违背了“开闭原则”。

适用情况包括:要为一个复杂子系统提供一个简单接口;客户程序与多个子系统之间存在很大的依赖性;在层次化结构中,需要定义系统中每一层的入口,使得层与层之间不直接产生联系。

参考链接

http://design-patterns.readthedocs.io/zh_CN/latest/structural_patterns/facade.html
http://www.cnblogs.com/hegezhou_hot/archive/2010/12/06/1897398.html
http://blog.csdn.net/hguisu/article/details/7533759

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值