JavaScript设计模式 -- 外观模式

news/2025/2/28 21:41:37/

外观模式(Facade Pattern)是一种设计模式,用于为复杂的子系统提供一个简单的接口,以减少子系统间的依赖和复杂性。在 JavaScript 中实现外观模式,通常是为了提供一个统一的接口来简化客户端与多个子系统交互的过程。

外观模式的优点

简化接口:通过单一的接口隐藏了系统的复杂性,使得客户端使用更加简单。

减少依赖:降低了客户端与子系统之间的耦合度,因为客户端不需要直接与子系统交互。

提高安全性:可以在外观中加入访问控制,限制客户端对子系统的直接访问。

外观模式的结构

外观模式通常包含以下几个角色:

Facade(外观角色):为多个子系统对外提供一个共同的接口。

Subsystem(子系统角色):一系列紧密相关的类的集合,它们共同完成了一个特定的功能。

示例实现

假设我们有一个复杂的系统,包括一个灯光控制模块、一个空调控制模块和一个电视控制模块,我们可以创建一个外观类来简化这些模块的交互。

1. 定义子系统

class Light {

    turnOn() {

        console.log("Light is on");

    }

    turnOff() {

        console.log("Light is off");

    }

}

class AirConditioner {

    setTemperature(temp) {

        console.log(`Air conditioner temperature set to ${temp}`);

    }

}

class TV {

    turnOn() {

        console.log("TV is on");

    }

    turnOff() {

        console.log("TV is off");

    }

    setChannel(channel) {

        console.log(`TV channel set to ${channel}`);

    }

}

2. 创建外观类

class HomeAutomationFacade {

    constructor() {

        this.light = new Light();

        this.airConditioner = new AirConditioner();

        this.tv = new TV();

    }

    watchTV() {

        this.tv.turnOn();

        this.tv.setChannel(10); // 假设我们想看第10频道新闻。

        console.log("Ready to watch TV");

    }

    sleep() {

        this.tv.turnOff();

        this.light.turnOff();

        this.airConditioner.setTemperature(25); // 假设我们想设置空调温度为25度。

        console.log("Preparing for sleep");

    }

}

3. 使用外观类

const facade = new HomeAutomationFacade();

facade.watchTV(); // 使用外观类简化操作电视的过程。

facade.sleep();   // 使用外观类简化准备睡觉的过程。

通过这种方式,客户端代码只需要与 HomeAutomationFacade 类交互,而不需要直接与 Light、AirConditioner 和 TV 类交互,从而简化了客户端代码并降低了系统的耦合度。这就是外观模式在 JavaScript 中的典型应用。


http://www.ppmy.cn/news/1575599.html

相关文章

游戏引擎学习第126天

仓库:https://gitee.com/mrxiao_com/2d_game_3 单生产者/多消费者问题 在今天的讨论中,主要与多线程编程有关。问题出现在多线程环境中,当多个线程同时访问共享资源时,代码没有正确处理竞争条件,导致了错误的行为。 具体问题发…

Vscode编辑器获取更新远程最新分支

解决:打开当前项目的终端,输入 git remote update origin --prune # 查看远程分支 git branch -r --prune --prune 参数告诉 Git 清理那些远程仓库中已经删除但本地仍然存在的跟踪分支。 命令作用 更新远程仓库引用: git remote update …

我是如何从 0 到 1 找到 Web3 工作的?

作者:Lotus的人生实验 关于我花了一个月的时间,从 0 到 1 学习 Web3 相关的知识和编程知识。然后找到了一个 Web3 创业公司实习的远程工作。 👇👇👇 我的背景: 计算机科班,学历还可以(大厂门槛水平) 毕业工…

大学专业01-资源勘查工程专业

资源勘查工程(油气与清洁地质能源)专业分析 一、专业前景 核心优势 国家战略需求驱动 服务于“双碳”目标,聚焦油气勘探与清洁能源开发(如CO₂地质封存、地热开发等),契合能源转型趋势5,7,11。 学科实力…

数据的“潘多拉魔盒”:大数据伦理的深度思考

数据的“潘多拉魔盒”:大数据伦理的深度思考 在大数据的世界里,数据是一种“新石油”,它能驱动商业、优化决策、甚至预测未来。但就像电影里的“潘多拉魔盒”,数据一旦被滥用,便可能引发严重的道德和伦理问题。大数据…

Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境

文章目录 一、VSCode配置Node.js运行环境 1、软件安装2、安装Node.js插件3、配置VSCode4、创建并运行Node.js文件5、调试Node.js代码 一、VSCode配置Node.js运行环境 1、软件安装 安装下面的软件: 安装Node.js:Node.js官网 下载Node.js安装包。建议选…

白帽黑客系列教程之Windows驱动开发(64位环境)入门教程(九)

为什么要写这篇文章呢? 作为一名白帽黑客,如果想要学习ROOTKIT攻防技术,就必须要有能力进行驱动开发! 本文章仅提供学习,切勿将其用于不法手段! 在Windows操作系统的64位环境中,进行ROOTKIT攻…

【蓝桥杯单片机】第十三届省赛第二场

一、真题 二、模块构建 1.编写初始化函数(init.c) void Cls_Peripheral(void); 关闭led led对应的锁存器由Y4C控制关闭蜂鸣器和继电器 2.编写LED函数(led.c) void Led_Disp(unsigned char ucLed); 将ucLed取反的值赋给P0 开启锁存器 关闭锁存…