![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/9c894d7e2707c3b77362e1001e333459.jpeg#pic_center)
1、场景举例
vs编译器,仅看到了build,但是实际上完成了编译链接等复杂操作
2、主要应用场景
想要为一个复杂子系统提供一个简单接口
3、类图
4、用C语言实现外观模式
角色定义
实现一个组合步骤的门面函数
案例描述
使用门面模式,逛一次广场
案例实现
#include <stdio.h>
#include <stdlib.h>
typedef struct FOOD {
void (*eat)();
}Food;
typedef struct SHOP {
void (*buy)();
}Shop;
typedef struct BOOK {
void (*read)();
}Book;
typedef struct PLAZA {
struct FOOD* food;
struct SHOP* shop;
struct BOOK* book;
void (*play)(struct PLAZA* p);
}Plaza;
void play(struct PLAZA* p)
{
if (p == NULL) {
return;
}
p->food->eat();
p->shop->buy();
p->book->read();
}
void eat()
{
printf("eat food!!!\n");
}
void buy()
{
printf("buy cloth!!!\n");
}
void read()
{
printf("read book!!!\n");
}
struct PLAZA* create_plaza()
{
struct FOOD* food = (struct FOOD*)malloc(sizeof(struct FOOD));
if (food == NULL) {
return NULL;
}
food->eat = eat;
struct SHOP* shop = (struct SHOP*)malloc(sizeof(struct SHOP));
if (shop == NULL) {
return NULL;
}
shop->buy = buy;
struct BOOK* book = (struct BOOK*)malloc(sizeof(struct BOOK));
if (book == NULL) {
return NULL;
}
book->read = read;
struct PLAZA* plaza = (struct PLAZA*)malloc(sizeof(struct PLAZA));
if (plaza == NULL) {
return NULL;
}
plaza->book = book;
plaza->food = food;
plaza->shop = shop;
plaza->play = play;
return plaza;
}
void delete_plaza(Plaza* plaza)
{
if (plaza->book != NULL) {
free(plaza->book);
}
if (plaza->food != NULL) {
free(plaza->food);
}
if (plaza->shop != NULL) {
free(plaza->shop);
}
if (plaza != NULL) {
free(plaza);
}
}
int main()
{
struct PLAZA* plaza = NULL;
plaza = create_plaza();
if (plaza == NULL) {
delete_plaza(plaza);
return 1;
}
plaza->play(plaza);
delete_plaza(plaza);
return 0;
}
5、使用C++实现门面模式
角色定义
门面类
案例描述
使用门面模式逛一次广场
案例实现
#include <iostream>
using namespace std;
class FOOD {
public:
void eat()
{
cout << "eat food!!!" << endl;
}
};
class SHOP {
public:
void buy()
{
cout << "buy cloth!!!" << endl;
}
};
class BOOK {
public:
void read()
{
cout << "buy cloth!!!" << endl;
}
};
class PLAZA {
public:
void play()
{
FOOD food;
SHOP shop;
BOOK book;
food.eat();
shop.buy();
book.read();
}
};
int main()
{
PLAZA plaza;
plaza.play();
return 0;
}
6、优点
1、对客户屏蔽了子系统组件,减少了客户处理的对象的数目,使得子系统使用起来更加方便;
2、实现了子系统与客户之间的松耦合关系,子系统内部的功能组件往往是紧耦合的;松耦合系统使得子系统的组件变化不会影响到它的客户。外观模式有助于建立层次结构系统,也有助于对对象之间的依赖关系分层。外观模式可以消除复杂的循环依赖关系。这一点在客户程序与子系统是分别实现的时候尤为重要
7、总结
设计初期
应该有意识的将不同层分离,比如常用的三层架构,就是考虑在数据访问层,与业务逻辑层表示层之间,建立Facade,使复杂的子系统提供一个简单的接口,降低耦合性;
开发阶段
子系统往往因为不断的重构而变的越来越复杂,增加外观Facade可以提供一个简单的接口,减少它们之间的依赖;
维护阶段
可能这个系统已经非常难以维护和扩展了,此时你可以为新系统开发一个外观类,来提供设计粗糙或高度复杂的遗留代码的比较清晰简单的接口,让新系统与Facade对象交互,Facade与遗留代码交互所有复杂的工作。