设计模式--外观模式

外观模式(Facade Pattern)

外观模式(Facade Pattern)是一种结构型设计模式,它为子系统中的一组接口提供了一个一致的界面。外观模式定义了一个高层接口,使得子系统更加容易使用。它主要用于简化复杂系统的接口,提供一个简洁的接口给客户端使用,而隐藏系统的复杂性。

外观模式的优点

  1. 简化接口:通过提供一个统一的接口,外观模式简化了子系统的使用。
  2. 降低耦合:客户端不需要了解子系统的具体实现,从而减少了客户端与子系统之间的耦合。
  3. 更好的划分访问层次:通过引入外观模式,可以让子系统内部模块更容易维护和扩展。

外观模式的结构

外观模式涉及以下角色:

  1. Facade(外观类):提供一个高层接口,供客户端调用。
  2. 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

电影开始!

关闭家庭影院系统...

灯光打开

音响系统关闭

投影仪关闭

播放器关闭

家庭影院系统已关闭!

解释

  1. 子系统类Light, SoundSystem, Projector, Player 分别表示家庭影院系统的各个子系统。
  2. 外观类HomeTheaterFacade 提供了简化的接口,通过组合调用子系统的方法来实现更复杂的操作,如 watchMovieendMovie
  3. 客户端FacadePatternDemo 中的客户端代码通过 HomeTheaterFacade 类来控制家庭影院系统,而不需要直接与各个子系统交互。

适用场景

  1. 简化复杂系统的使用:当一个系统非常复杂或者有很多子系统时,可以使用外观模式来提供一个简单的接口,方便客户端使用。
  2. 解耦系统与客户端:通过外观模式,客户端不需要了解系统的内部细节,从而降低系统与客户端之间的耦合度。
  3. 层次化系统设计:外观模式可以帮助你划分系统的层次,使得每一层次只与相邻的层次交互,从而提高系统的可维护性。

通过使用外观模式,我们可以隐藏系统的复杂性,提供一个简洁的接口给客户端使用,从而提高系统的可维护性和可扩展性

相关推荐
杨充1 天前
10.可测试性实战设计
设计模式·开源·代码规范
杨充1 天前
9.重构十二式的实战
设计模式·开源·代码规范
杨充1 天前
6.设计原则的全景图
设计模式·开源·全栈
杨充1 天前
2.面向对象的特性
设计模式
杨充1 天前
7.SOLID原则案例汇
设计模式·开源·全栈
杨充1 天前
8.反模式与坏味道
设计模式·开源·代码规范
杨充1 天前
3.接口vs抽象类比较
设计模式
咖啡八杯1 天前
文法、BNF与AST
java·设计模式·解释器模式·ast·文法
咖啡八杯2 天前
GoF设计模式——解释器模式
java·后端·spring·设计模式