外观模式(Facade Pattern)
外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个一致的界面。外观模式定义了一个高层接口,使得子系统更加容易使用。它主要用于简化复杂系统的接口,提供一个简洁的接口给客户端使用,而隐藏系统的复杂性。
外观模式的优点
- 简化接口:通过提供一个统一的接口,外观模式简化了子系统的使用。
- 降低耦合:客户端不需要了解子系统的具体实现,从而减少了客户端与子系统之间的耦合。
- 更好的划分访问层次:通过引入外观模式,可以让子系统内部模块更容易维护和扩展。
外观模式的结构
外观模式涉及以下角色:
- Facade(外观类):提供一个高层接口,供客户端调用。
- Subsystem classes(子系统类):一组类,它们实现子系统的功能,外观类会调用它们来完成客户端请求。
示例代码
假设我们有一个家庭影院系统,包括灯光控制、音响系统、投影仪和播放器。通过外观模式,我们可以创建一个外观类来简化这些子系统的操作。
子系统类
java
class Light {
public void on() {
System.out.println("灯光打开");
}
public void off() {
System.out.println("灯光关闭");
}
}
class SoundSystem {
public void on() {
System.out.println("音响系统打开");
}
public void off() {
System.out.println("音响系统关闭");
}
public void setVolume(int volume) {
System.out.println("设置音量到 " + volume);
}
}
class Projector {
public void on() {
System.out.println("投影仪打开");
}
public void off() {
System.out.println("投影仪关闭");
}
public void setInput(String input) {
System.out.println("设置输入源为 " + input);
}
}
class Player {
public void on() {
System.out.println("播放器打开");
}
public void off() {
System.out.println("播放器关闭");
}
public void play(String movie) {
System.out.println("播放电影: " + movie);
}
}
外观类
java
class HomeTheaterFacade {
private Light light;
private SoundSystem soundSystem;
private Projector projector;
private Player player;
public HomeTheaterFacade(Light light, SoundSystem soundSystem, Projector projector, Player player) {
this.light = light;
this.soundSystem = soundSystem;
this.projector = projector;
this.player = player;
}
public void watchMovie(String movie) {
System.out.println("准备看电影...");
light.off();
soundSystem.on();
soundSystem.setVolume(10);
projector.on();
projector.setInput("HDMI");
player.on();
player.play(movie);
System.out.println("电影开始!");
}
public void endMovie() {
System.out.println("关闭家庭影院系统...");
light.on();
soundSystem.off();
projector.off();
player.off();
System.out.println("家庭影院系统已关闭!");
}
}
客户端代码
java
public class FacadePatternDemo {
public static void main(String[] args) {
Light light = new Light();
SoundSystem soundSystem = new SoundSystem();
Projector projector = new Projector();
Player player = new Player();
HomeTheaterFacade homeTheater = new HomeTheaterFacade(light, soundSystem, projector, player);
homeTheater.watchMovie("Inception");
homeTheater.endMovie();
}
}
输出结果
准备看电影...
灯光关闭
音响系统打开
设置音量到 10
投影仪打开
设置输入源为 HDMI
播放器打开
播放电影: Inception
电影开始!
关闭家庭影院系统...
灯光打开
音响系统关闭
投影仪关闭
播放器关闭
家庭影院系统已关闭!
解释
- 子系统类 :
Light
,SoundSystem
,Projector
,Player
分别表示家庭影院系统的各个子系统。 - 外观类 :
HomeTheaterFacade
提供了简化的接口,通过组合调用子系统的方法来实现更复杂的操作,如watchMovie
和endMovie
。 - 客户端 :
FacadePatternDemo
中的客户端代码通过HomeTheaterFacade
类来控制家庭影院系统,而不需要直接与各个子系统交互。
适用场景
- 简化复杂系统的使用:当一个系统非常复杂或者有很多子系统时,可以使用外观模式来提供一个简单的接口,方便客户端使用。
- 解耦系统与客户端:通过外观模式,客户端不需要了解系统的内部细节,从而降低系统与客户端之间的耦合度。
- 层次化系统设计:外观模式可以帮助你划分系统的层次,使得每一层次只与相邻的层次交互,从而提高系统的可维护性。
通过使用外观模式,我们可以隐藏系统的复杂性,提供一个简洁的接口给客户端使用,从而提高系统的可维护性和可扩展性