【设计模式-外观】

这里写自定义目录标题

定义

为子系统中一组相关接口提供一致界面,定义一个高级接口,使得子系统更加容易使用。

UML图

角色作用

  • 外观(Facade)角色:这是外观模式的核心,它知道哪些子系统类负责处理请求,并将客户端的请求代理给适当的子系统对象。外观角色通常是单例的,以确保它在整个系统中只有一个实例,为所有客户端提供一致的服务。
  • 子系统(Subsystem)角色:可以有一个或多个子系统类,每个子系统实现了一部分特定的功能。这些子系统类通常是复杂的,并且它们之间可能存在复杂的交互关系。外观模式的目的就是要封装这些子系统的复杂性,使客户端不需要直接与这些复杂的子系统交互。

代码

子系统类

假设我们正在构建一个家庭影院系统,它包含多个子系统,如 DVD 播放器、投影仪和音响。

java 复制代码
// DVD 播放器子系统
class DVDPlayer {
    public void on() {
        System.out.println("DVD player is on");
    }

    public void play(String movie) {
        System.out.println("Playing movie: " + movie);
    }

    public void off() {
        System.out.println("DVD player is off");
    }
}

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

    public void wideScreenMode() {
        System.out.println("Projector is in widescreen mode");
    }

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

// 音响子系统
class Stereo {
    public void on() {
        System.out.println("Stereo is on");
    }

    public void setVolume(int volume) {
        System.out.println("Stereo volume set to " + volume);
    }

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

外观类

外观类将提供给客户端一个简单统一的接口来操作家庭影院系统。

java 复制代码
// 家庭影院外观类
class HomeTheaterFacade {
    private DVDPlayer dvdPlayer;
    private Projector projector;
    private Stereo stereo;

    public HomeTheaterFacade() {
        dvdPlayer = new DVDPlayer();
        projector = new Projector();
        stereo = new Stereo();
    }

    public void watchMovie(String movie) {
        System.out.println("Get ready to watch a movie...");
        dvdPlayer.on();
        projector.on();
        projector.wideScreenMode();
        stereo.on();
        stereo.setVolume(10);
        dvdPlayer.play(movie);
    }

    public void endMovie() {
        System.out.println("Shutting down the movie theater...");
        dvdPlayer.off();
        projector.off();
        stereo.off();
    }
}

客户端类

客户端可以通过外观类简单地操作家庭影院系统,而无需直接与各个子系统交互。

java 复制代码
public class FacadePatternExample {
    public static void main(String[] args) {
        HomeTheaterFacade homeTheater = new HomeTheaterFacade();
        homeTheater.watchMovie("The Dark Knight");
        homeTheater.endMovie();
    }
}

使用场景

  • 为复杂子系统提供复杂接口
  • 客户程序和抽象实现部分存在很大依赖性,引入facade隔离客户和子系统
相关推荐
小安同学iter8 分钟前
天机学堂day05
java·开发语言·spring boot·分布式·后端·spring cloud·微服务
那我掉的头发算什么8 分钟前
【javaEE】文件&IO--文件内容操作
java·java-ee·文件·文件操作
yaoxin52112316 分钟前
262. Java 集合 - Java 中 ArrayList 与 LinkedList 读取元素性能大对决
java·开发语言
大迪吃小迪22 分钟前
Vert.x 常见问题精简总结
java·websocket·web
毕设源码-钟学长34 分钟前
【开题答辩全过程】以 农村困境儿童帮扶助学系统为例,包含答辩的问题和答案
java·eclipse
白露与泡影35 分钟前
springboot中File默认路径
java·spring boot·后端
heartbeat..40 分钟前
使用 Apache POI 实现 Excel 文件读写(导入 导出)操作的工具类
java·apache·excel·文件
技术摆渡人41 分钟前
Android 系统技术探索(3)光影魔术(SurfaceFlinger & 图形栈)。
android
咕咕嘎嘎10241 小时前
C/C++内存对齐
java·c语言·c++
认真敲代码的小火龙1 小时前
【JAVA项目】基于JAVA的图书管理系统
java·开发语言·课程设计