设计模式(9)-门面模式

Posted by Tango on November 12, 2015

为子系统中的一组接口提供一个一致的界面, Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。将一个系统划分成为若干个子系统有利于降低系统的复杂性。一个常见的设计目标是使子系统间的通信和相互依赖关系达到最小,它为子系统中较一般的设施提供了一个单一而简单的界面。

1.模式适用性

  • 当需要为一个复杂子系统提供一个简单的接口时
  • 当需要减小子系统间的相互依赖时,可使用facade模式简化依赖关系
  • 维护遗留系统难以扩展时,使用facade模式简化遗留系统的使用

2.模式结构

Screenshot from 2015-11-12 23:03:28

(1)Facade:作为子系统的统一接口,知道哪些子系统负责处理请求,并将客户的请求代理给适当的子系统对象处理

(2)Subystem classes(SubSystemOne,SunSystemTwo等):实现子系统的功能,处理由Facade指派的任务

3.实现

#include <iostream>
using namespace std;

class SubSystemOne
{
public:
	void MethodOne()
	{
		cout << "Sub one function" << endl;
	}
};

class SubSystemTwo
{
public:
	void MethodTwo()
	{
		cout << "Sub two function" << endl;
	}
};

class SubSystemThree
{
public:
	void MethodThree()
	{
		cout << "Sub three function" << endl;
	}
};

class SubSystemFour
{
public:
	void MethodFour()
	{
		cout << "Sub four function" << endl;
	}
};

class Facade
{
private:
	SubSystemOne *one;
	SubSystemTwo *two;
	SubSystemThree *three;
	SubSystemFour *four;
public:
	Facade()
	{
		one = new SubSystemOne();
		two = new SubSystemTwo();
		three = new SubSystemThree();
		four = new SubSystemFour();
	}

	void MethodA()
	{
		cout << "***Function group A***" << endl;
		one->MethodOne();
		two->MethodTwo();
		three->MethodThree();
	}

	void MethodB()
	{
		cout << "***Function group B***" << endl;
		four->MethodFour();
		one->MethodOne();
	}
};

int main(int argc, char *argv[])
{
	Facade facade;

	facade.MethodA();
	facade.MethodB();

	return 0;
}