外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。属于结构型模式。这种模式涉及到一个单一的类,该类提供了客户端请求的简化方法和对现有系统类方法的委托调用。
适用场景:
1、当你要为一个复杂子系统提供一个简单接口时。子系统往往因为不断演化而变得越来越复杂。大多数模式使用时都会产生更多更小的类。这使得子系统更具可重用性,也更容易对子系统进行定制,但这也给那些不需要定制子系统的用户带来一些使用上的困难。外观模式facade可以提供一个简单的缺省视图,这一视图对大多数用户来说已经足够,而那些需要更多的可定制性的用户可以越过提供的外观层。
2、客户程序与抽象类的实现部分之间存在着很大的依赖性。引入外观模式facade将这个子系统与客户以及其他的子系统分离,可以提高子系统的独立性和可移植性。
3、当你需要构建一个层次结构的子系统时,使用外观模式facade定义子系统中每层的入口点。如果子系统之间是相互依赖的,你可以让它们仅通过外观模式facade进行通讯,从而简化了它们之间的依赖关系。
采用菜鸟教程的例子,这里用C++实现
#include<iostream>
using namespace std;
//创建一个形状的抽象接口shape
class shape
{
public:
shape() {};
virtual ~shape() {};
virtual void draw()=0;
};
//创建实现形状抽象接口的实体类rectangle
class rectangle :public shape
{
public:
rectangle() {};
~rectangle() {};
void draw();
};
void rectangle::draw()
{
cout << "rectangle::draw()" << endl;
}
//创建实现形状抽象接口的实体类square
class square :public shape
{
public:
square() {};
~square() {};
void draw();
};
void square::draw()
{
cout << "square::draw()" << endl;
}
//创建实现形状抽象接口的实体类circle
class circle :public shape
{
public:
circle() {};
~circle() {};
void draw();
};
void circle::draw()
{
cout << "circle::draw()" << endl;
}
//创建一个外观类。隐藏系统的复杂性,提供访问系统的接口
class shapemaker
{
public:
shapemaker();
~shapemaker();
void drawcircle();
void drawrectangle();
void drawsquare();
private:
shape *circlet;
shape *rectanglet;
shape *squaret;
};
shapemaker::shapemaker()
{
circlet = (shape*)new circle();
rectanglet = (shape*)new rectangle();
squaret = (shape*)new square();
}
shapemaker::~shapemaker()
{
delete circlet;
circlet = NULL;
delete rectanglet;
rectanglet = NULL;
delete squaret;
squaret = NULL;
}
void shapemaker::drawcircle()
{
circlet->draw();
}
void shapemaker::drawrectangle()
{
rectanglet->draw();
}
void shapemaker::drawsquare()
{
squaret->draw();
}
int main()
{
shapemaker *shapemakert = new shapemaker();
shapemakert->drawcircle();
shapemakert->drawrectangle();
shapemakert->drawsquare();
delete shapemakert;
shapemakert = NULL;
system("pause");
return 0;
}
在visual studio 2015上运行结果: