外观模式\门面模式


在这里插入图片描述

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与遗留代码交互所有复杂的工作。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值