当前位置: 首页 > news >正文

设计模式笔记_结构型_门面模式

1. 门面模式介绍

门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化的接口,使得复杂子系统的功能对外界更易于使用。门面模式通过定义一个高层接口来隐藏系统的复杂性,用户可以通过这个接口与系统进行交互,而不需要了解系统内部的细节。

类比:想象一下你在使用一个智能手机。虽然手机内部有许多复杂的硬件和软件组件,但你只需要通过简单的触摸屏界面就可以完成各种操作,比如打电话、发短信、上网等。这个触摸屏界面就像是一个“门面”,它简化了手机内部复杂的操作。

优点:

  1. 简化接口:门面模式为复杂系统提供了一个简单的接口,使得用户能够更轻松地与系统交互。
  2. 降低耦合:客户端代码与复杂子系统之间的耦合度降低,因为客户端只需与门面接口交互。
  3. 更好的维护性:因为子系统的变化不会影响到客户端,只需调整门面即可。

2. 代码演示

假设我们有一套的家庭影院系统,包括电视、音响、DVD播放器等子系统。我们分别演示不适用门面模式和使用门面模式的观影流程。

2.1 影院各子系统代码

// 影院子系统组件
class Television {public void on() { System.out.println("Turning on the TV."); }public void off() { System.out.println("Turning off the TV."); }
}class SoundSystem {public void on() { System.out.println("Turning on the sound system."); }public void off() { System.out.println("Turning off the sound system."); }
}class DVDPlayer {public void on() { System.out.println("Turning on the DVD player."); }public void off() { System.out.println("Turning off the DVD player."); }
}

2.2 不使用门面模式观影流程

不使用门面模式时,我们需要和影院各系统打交道,看电影时需要依次开启电视,音箱、DVD播放器,结束观影时,又需要依次关闭各子系统:

//未使用门面模式的客户端代码
public class UnUserFacadePatternDemo {public static void main(String[] args) {Television tv = new Television();SoundSystem soundSystem = new SoundSystem();DVDPlayer dvdPlayer = new DVDPlayer();System.out.println("--------开始观影-----------");//1.打开电视tv.on();//2.打开声音系统soundSystem.on();//3.打开DVD播放器dvdPlayer.on();System.out.println("--------观影中-----------");System.out.println("--------结束观影-----------");//1.关闭电视tv.off();//2.关闭声音系统soundSystem.off();//3.关闭DVD播放器dvdPlayer.off();}
}

2.3 使用门面模式观影流程

使用门面模式,我们可以创建一个统一的接口来简化这些设备的操作:

// 影院系统门面
class HomeTheaterFacade {private Television tv;private SoundSystem sound;private DVDPlayer dvd;public HomeTheaterFacade(Television tv, SoundSystem sound, DVDPlayer dvd) {this.tv = tv;this.sound = sound;this.dvd = dvd;}public void watchMovie() {System.out.println("Getting ready to watch a movie...");tv.on();sound.on();dvd.on();}public void endMovie() {System.out.println("Shutting down movie theater...");tv.off();sound.off();dvd.off();}
}

对应的观影流程如下,不再需要和各子系统打交道,只需通过门面接口来打开或关闭观影系统:

// 使用门面模式的客户端代码
public class FacadePatternDemo {public static void main(String[] args) {// 创建各个子系统组件Television tv = new Television();SoundSystem sound = new SoundSystem();DVDPlayer dvd = new DVDPlayer();// 创建门面HomeTheaterFacade homeTheater = new HomeTheaterFacade(tv, sound, dvd);System.out.println("--------开始观影-----------");homeTheater.watchMovie();System.out.println("--------观影中-----------");System.out.println("--------开始观影-----------");homeTheater.endMovie();}
}

http://www.dtcms.com/a/325683.html

相关文章:

  • 2020/12 JLPT听力原文 问题一 3番
  • VTK 标签中文
  • MFC C++ 使用ODBC方式调用Oracle数据库的详细步骤
  • Go 多进程编程-socket(套接字)
  • 今日项目之线程同步操作项目
  • 生成模型实战 | MuseGAN详解与实现
  • encoder-only / decoder-only / encoder-decoder架构分析
  • 云原生应用的DevOps2(Jenkins渗透场景)
  • Spring Boot 单元测试:@SpyBean 使用教程
  • Linux生成自签名 SSL 证书(适用于测试或内部使用)
  • CI/CD渗透测试靶场
  • cesium/resium 修改子模型材质
  • [Oracle] UNPIVOT 列转行
  • MySQL 数据操作全流程:创建、读取、更新与删除实战
  • openEuler、 CentOS、Ubuntu等 Linux 系统中,Docker 常用命令总结
  • FPGA+护理:跨学科发展的探索(一)
  • SAE J2716多协议网关的硬件架构与实时协议转换机制解析
  • 三种常见的菜单路由封装方式详解
  • rust编译过程的中间表现形式如何查看,ast,hir,mir
  • Rust学习笔记(一)|Rust初体验 猜数游戏
  • Excel 实战:基因表达矩阵前处理中测序符号的快速剥离方法
  • K210人脸识别系统
  • 在Linux中部署tomcat
  • 【Redis的安装与配置】
  • 如何理解Tomcat、Servlet、Catanalina的关系
  • 从零开始的云计算生活——第四十一天,勇攀高峰,Kubernetes模块之单Master集群部署
  • 微美全息(NASDAQ:WIMI)Raft携手节点动态评估:引领联盟链高性能共识新潮流
  • 为 Promethus 配置https访问
  • 机器学习 - Kaggle项目实践(1)Titanic
  • 揭开内容分发网络(CDN)的神秘面纱:互联网的隐形加速器