设计模式_12 外观模式(含 UML图 和 C++代码)

12 外观模式

12.1 概念

通过为多个复杂子系统提供一个一致的接口,而使这些子系统更加容易被访问的模式。该模式对外有一个统一接口,外部应用程序不必关注内部子系统的具体实现细节。降低了程序的复杂度,提高了程序的可维护性。
迪米特法则的典型应用。

和代理模式的区别:代理模式是通过继承方式完成同一种方法。外观模式是通过聚合完成多种方法。

12.2 结构

外观角色:为多个子系统提供一个共同的接口。
子系统角色:实现系统的部分功能,客户可以通过外观角色访问它。

12.3 实现

12.3.1 UML图

在这里插入图片描述

12.3.2 代码

#include<iostream>
#include<string>
using namespace std;

class Light {
public:
	void on() {
		cout << "开灯" << endl;
	}
	void off() {
		cout << "关灯" << endl;
	}
};

class AirCondition {
public:
	void on() {
		cout << "开空调" << endl;
	}
	void off() {
		cout << "关空调" << endl;
	}
};

class Audio {
public:
	void on() {
		cout << "开音响" << endl;
	}
	void off() {
		cout << "关音响" << endl;
	}
};

class SmartHomeSystem {
private:
	Light* light;
	AirCondition* airCondition;
	Audio* audio;
public:
	SmartHomeSystem() {
		light = new Light();
		airCondition = new AirCondition();
		audio = new Audio();
	}
	void say(string operation) {
		if (operation == "on") {
			this->on();
			cout << "全部家电已开启\n" << endl;
		}
		else if (operation == "off") {
			this->off();
			cout << "全部家电已关闭\n" << endl;
		}
		else {
			cout << "没有这个功能" << endl;
		}
	}
	void on() {
		light->on();
		airCondition->on();
		audio->on();
	}
	void off() {
		light->off();
		airCondition->off();
		audio->off();
	}
};

int main() {
	SmartHomeSystem* system = new SmartHomeSystem();
	system->say("on");
	system->say("off");
	system->say("阿巴阿巴");
	return 0;
}

12.4 优缺点

12.4.1 优点

降低了子系统与客户端之间的耦合度,使得子系统的变化不会影响调用它的客户类。
对客户屏蔽了子系统组件,减少了客户处理的对象数目,使得子系统使用起来更加容易。

12.4.2 缺点

不符合开闭原则,修改很麻烦。

12.5 使用场景

对分层结构系统构建时,使用外观模式定义子系统中每层的入口点可以简化子系统之间的依赖关系
当一个复杂的子系统很多时,外观模式可以为系统设计一个简单的接口供外界访问。
当客户端与多个子系统之间存在很大的联系时,引入外观模式可将他们分离,从而提高子系统的独立性和可移植性。

retur 设计模式概述;

返回设计模式概述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值