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

1. 门面模式介绍

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

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

优点:

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

2. 代码演示

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

2.1 影院各子系统代码

java 复制代码
// 影院子系统组件
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播放器,结束观影时,又需要依次关闭各子系统:

java 复制代码
//未使用门面模式的客户端代码
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 使用门面模式观影流程

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

java 复制代码
// 影院系统门面
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();
    }
}

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

java 复制代码
// 使用门面模式的客户端代码
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();
    }
}
相关推荐
nnsix19 分钟前
Unity SenseGlove力反馈手套 sdk 笔记
笔记
智嵌电子22 分钟前
【笔记篇】【硬件基础篇】模拟电子技术基础 (童诗白) 第0章 绪论
笔记·嵌入式硬件·模拟电子技术基础
im_AMBER23 分钟前
React 20 useState管理组件状态 | 解构 | 将事件处理函数作为 props 传递 | 状态提升
前端·javascript·笔记·学习·react.js·前端框架
be or not to be26 分钟前
HTML 与 CSS 基础入门笔记
css·笔记·html
AI视觉网奇32 分钟前
ue 蓝图 学笔记
笔记·ue5
走在路上的菜鸟38 分钟前
Android学Dart学习笔记第二十五节 类修饰符
android·笔记·学习·flutter
polarislove021443 分钟前
8.2 时钟树编程-嵌入式铁头山羊STM32笔记
笔记·stm32·嵌入式硬件
wanderful_1 小时前
Javascript笔记分享-流程控制(超级超级详细!!!)
javascript·笔记·流程控制·实战案例·新手友好
ghgxm5201 小时前
EXCEL使用VBA代码实现按条件查询数据库--简单实用
开发语言·数据仓库·笔记·excel·数据库开发
阿波罗尼亚1 小时前
Head First设计模式(十三) 设计原则 现实世界中的模式
设计模式