欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

外观模式\门面模式

程序员文章站 2024-03-17 17:23:10
...


外观模式\门面模式

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

相关标签: 编程设计模式