C++设计模式---外观模式

外观模式

定义

       为子系统中的一组接口(相当与上面的模块)提供一个一致的界面。此模式定义了一个高层接口,这个结口使得这一子系统更加easy使用。说白了就是:我们仅仅需调用高层的函数接口。而不用关心高层内部调用是怎样组合底层方法的。更不用关心底层函数是怎样实现的。

什么是外观模式?

       外观模式,很多人也把它叫做门面模式。在GOF的《设计模式:可复用面向对象软件的基础》一书中对外观模式是这样说的:将子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。

       细细的理解这句话;子系统中的一组接口,就好比上面举得例子中的语法分析,生成中间代码,生成汇编代码,链接成可执行程序或库;外观模式定义的一个高层接口,就好比上面说的Build按钮,通过这样的一个Build按钮,让编译器更加容易使用,对于这一点,从Linux C++/C转Windows C++/C的程序员是最有体会的。visual studio提供的强大功能,只需要一个Build按钮,就可以进行Build动作,而不需要去写makefile文件,然后再去执行一些命令进行编译。

优点

  1. 减少客户端与系统之间的耦合度;
  2. 简化客户端代码;

缺点

  1. 不符合开闭原则,扩张功能需要修改客户端和统一接口的代码;

使用场景

  1. 客户端与系统存在最大的依赖性;
  2. 为复杂系统提供一个统一的接口;

参数

  • Facade:知道哪些子系统类负责处理请求,并且将客户的请求代理给适当的子系统对象;
  • SubSystem:实现子系统具体的功能;处理由Facade对象指派的任务;但是,SubSystem没有Facade的任何相关信息,也就是说,没有指向Facade的指针;
  • Client:通过发送请求给Facade的方式与子系统进行通信,而不直接与子系统打交道,Facade将这些消息转发给适当的子系统对象。尽管是子系统中的有关对象在做实际工作,但Facade模式本身也必须将它的接口转换成子系统的接口,这里是不是有点适配器模式的感觉呢?这就是学习结构型设计模式的感觉,感觉都很相似,但是仔细的去研究时,就会发现各自的用处;

示例:顾客下订单,然后餐厅开始做晚饭,外卖员送晚饭,顾客吃晚饭,其中顾客只用下订单即可。

// Cplus_study.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <cstring>
using namespace std;
//餐厅---SubSystem
class Restaurant {
public:
	void makeDinner() {
		cout << "餐厅做晚饭!\n";
	}
};

//外卖员---SubSystem
class Driver {
public:
	void sendDinner() {
		cout << "外卖员送晚饭!\n";
	}
};

//Order---Facade
class Order {
public:
	void order() {
		cout << "下订单!\n";
		restaurant.makeDinner();
		driver.sendDinner();
		
	}

private:
	Restaurant restaurant;
	Driver driver;
};

//Client---Client
class Client {
public:
	void eat() {
		o.order();
		cout << "顾客吃晚饭!\n";
	}
private:
	Order o;
};


int main(int argc, char *argv[])
{
	Client client;
	client.eat();
	system("pause");
	return 0;
}

结果

参考

C++设计模式---外观模式

外观模式之C++实现

C++实现外观模式

发布了90 篇原创文章 · 获赞 6 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_37160123/article/details/103774273