外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个一致的界面。外观模式定义了一个高层接口,使得子系统更加容易使用。它主要用于简化复杂系统的接口,提供一个简洁的接口给客户端使用,而隐藏系统的复杂性。
外观模式涉及以下角色:
假设我们有一个家庭影院系统,包括灯光控制、音响系统、投影仪和播放器。通过外观模式,我们可以创建一个外观类来简化这些子系统的操作。
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); } } 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("家庭影院系统已关闭!"); } } 客户端代码
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 类来控制家庭影院系统,而不需要直接与各个子系统交互。通过使用外观模式,我们可以隐藏系统的复杂性,提供一个简洁的接口给客户端使用,从而提高系统的可维护性和可扩展性