23种设计模式之十一(结构型模式)Facade模式

一、简介

        Facade门面模式是为了解决的问题是:在软件系统开发中也经常回会遇到这样的情况,可能你实现了一些接口(模块)都分布在几个类中(比如 A 和 B、C、D), A中实现了一些接口,B 中实现了另一些接口(或者 A 代表一个独立模块,B、C、D 代表另一些独立模块)。然后程序员(使用你设计的开发人员)只有很少的要知道你的不同接口到底是在那个类中实现的,绝大多数只是想简单的组合你的 A-D 的类的接口,并不想知道这些接口在哪里实现的。因此使用Facade 模式在高层提供了一个统一的接口,代理所有的事情,自己只需维护和他的简单接口而已。
        Facade 模式的结构图:


        仅需要一个Facade对象,因此Facade对象通常设置成Singleton 模式

二、详解

1、代码实现

(1)代码facade.h:

#ifndef _FACADE_H_
#define _FACADE_H_

class Subsystem1;
class Subsystem2;
class Facade
{
	  public:
	  	  static Facade *GetInstance();
	  	  static void CloseInstance();
	  	  void OperationWrapper();
    protected:
    	  Facade();
	  	  ~Facade();
    private:
    	  Subsystem1* _subs1; 
        Subsystem2* _subs2; 
        static Facade* _instance;
};

class Subsystem1
{
	  public:
	  	  Subsystem1();
	  	  ~Subsystem1();
	  	  void Operation();
	  protected:
    private:
};

class Subsystem2
{
	  public:
	  	  Subsystem2();
	  	  ~Subsystem2();
	  	  void Operation();
	  protected:
    private:
};

#endif
(2)代码facade.cpp:

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

Facade* Facade::_instance = NULL;
	
Facade *Facade::GetInstance()
{
	  if (!_instance) {
	      _instance = new Facade();
	  }
	  return _instance;
}

void Facade::CloseInstance()
{
	  if (_instance) delete _instance;
}

Facade::Facade()
{
	  _subs1 = new Subsystem1();
	  _subs2 = new Subsystem2();
}

Facade::~Facade()
{
	  if (_subs1) delete _subs1;
	  if (_subs2) delete _subs2;
}

void Facade::OperationWrapper()
{
	  cout<<"Facade::OperationWrapper"<<endl;
	  _subs1->Operation();
	  _subs2->Operation();
}

Subsystem1::Subsystem1()
{
}

Subsystem1::~Subsystem1()
{
}

void Subsystem1::Operation()
{
	  cout<<"---Subsystem1 Operation..."<<endl;
}

Subsystem2::Subsystem2()
{
}

Subsystem2::~Subsystem2()
{
}

void Subsystem2::Operation()
{
	  cout<<"---Subsystem2 Operation..."<<endl;
}
(3)代码main.cpp:

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

int main()
{
	  Facade *fd = Facade::GetInstance();
	  fd->OperationWrapper();
	  
	  Facade::CloseInstance();
	  return 0;
}
(4)makefile:
CFLAGS = -g
DEFINED = #-D _VERSION
LIBS = 
CC = g++
INCLUDES = -I./
OBJS= main.o facade.o
TARGET= main
all:$(TARGET)

$(TARGET):$(OBJS)
	$(CC) $(CFLAGS) -o $@ $(OBJS)

.SUFFIXES:.o .h
.SUFFIXES:.cpp .o
.cpp.o:
	$(CC) $(DEFINED) -c $(CFLAGS) -o $@ $<

ok:
	./$(TARGET)
clean:
	rm -f $(OBJS) $(TARGET) core *.log

2、运行结果

(Centos6.3系统中运行结果:)


三、总结

(1)使用Facade模式,客户程序不需要直接访问子系统对象。Facade模式有助于建立层次结构系统,有助于对对象之间的依赖关系分层,也可以消除复杂的循环依赖关系降低客户-子系统之间的耦合度。

(2)源码已经打包上传到csdn上可登录下载(http://download.csdn.net/detail/taiyang1987912/8421907)。 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

乌托邦2号

博文不易,支持的请给予小小打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值