这里写自定义目录标题
定义
为子系统中一组相关接口提供一致界面,定义一个高级接口,使得子系统更加容易使用。
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隔离客户和子系统