java 实现外观模式

外观模式(Facade Pattern)是一种结构型设计模式,它提供了一个简化的接口,用于访问一组相关的接口或子系统。外观模式的主要目的是隐藏复杂的系统结构,提供一个更简单的接口供客户端使用。以下是一个简单的Java示例,演示如何实现外观模式:

首先,假设我们有一个音响系统,它包含了多个子系统,如音响、DVD播放器和投影仪。每个子系统都有自己的方法和状态。

java 复制代码
// 子系统1:音响
public class StereoSystem {
    public void turnOn() {
        System.out.println("Stereo System is ON");
    }

    public void turnOff() {
        System.out.println("Stereo System is OFF");
    }
}

// 子系统2:DVD播放器
public class DVDPlayer {
    public void play() {
        System.out.println("DVD Player is playing");
    }

    public void stop() {
        System.out.println("DVD Player is stopped");
    }
}

// 子系统3:投影仪
public class Projector {
    public void turnOn() {
        System.out.println("Projector is ON");
    }

    public void turnOff() {
        System.out.println("Projector is OFF");
    }
}

接下来,我们创建一个外观类 HomeTheaterFacade,它提供了一个简单的接口,封装了所有子系统的操作:

java 复制代码
public class HomeTheaterFacade {
    private StereoSystem stereoSystem;
    private DVDPlayer dvdPlayer;
    private Projector projector;

    public HomeTheaterFacade() {
        this.stereoSystem = new StereoSystem();
        this.dvdPlayer = new DVDPlayer();
        this.projector = new Projector();
    }

    public void watchMovie() {
        System.out.println("Get ready to watch a movie...");
        stereoSystem.turnOn();
        dvdPlayer.play();
        projector.turnOn();
    }

    public void endMovie() {
        System.out.println("Movie is over. Shutting down...");
        projector.turnOff();
        dvdPlayer.stop();
        stereoSystem.turnOff();
    }
}

现在,客户端可以通过使用 HomeTheaterFacade 来操作整个家庭影院系统,而无需了解每个子系统的细节:

java 复制代码
public class FacadePatternDemo {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade();

        // 开始观影
        homeTheater.watchMovie();

        // 结束观影
        homeTheater.endMovie();
    }
}

使用外观模式,客户端代码变得更简单,因为它不必了解复杂的子系统结构和操作。外观模式提供了一个更高级别的接口,使得系统更易于使用和维护。

相关推荐
ps酷教程6 小时前
Jackson 解决没有无参构造函数的反序列化问题
java
NiceCloud喜云6 小时前
Opus 4.8 的 Effort Control 怎么选:Low 到 Max 五档策略
android·java·大数据·前端·c++·python·spring
AI玫瑰助手7 小时前
Python函数:默认参数的定义与注意事项
开发语言·python·信息可视化
油炸自行车7 小时前
Claude Code 错误:API Error: 400 Failed to deserialize the JSON body into the
开发语言·javascript·json·trae·claude code·api error 400
肩上风骋7 小时前
C++14特性
开发语言·c++·c++14特性
_日拱一卒7 小时前
LeetCode:994腐烂的橘子
java·数据结构·算法·leetcode·深度优先
隔窗听雨眠7 小时前
Nginx网关响应慢排查手记
java·服务器·nginx
智慧物业老杨8 小时前
智慧物业合同周期管理系统:从风险预警到智能交接的全流程数智化落地方案
java·人工智能·python
源码宝8 小时前
MES系统源码:Java8 + SpringBoot2.7 + MySQL8 + Redis,后端源码清爽易扩展
java·后端·源码·springboot·mes系统·源码二开·mes源码
JAVA社区8 小时前
Java高级全套教程(十)—— SpringCloudAlibaba超详细实战详解
java·开发语言·spring cloud·面试·职场和发展