设计模式--外观模式

外观模式(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. 层次化系统设计:外观模式可以帮助你划分系统的层次,使得每一层次只与相邻的层次交互,从而提高系统的可维护性。

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

相关推荐
The shackles3 小时前
java设计模式 桥接模式
java·设计模式
学步_技术3 小时前
Python设计模式实战:开启软件设计的精进之旅
开发语言·python·设计模式
VaporGas3 小时前
JSP经典设计模式流程分析:JSP+JavaBean设计模式+MVC设计模式
java·设计模式·mvc·jsp·javabean
学计算机的小花神7 小时前
设计模式篇--抽象工厂模式
java·设计模式·抽象工厂模式
完球了7 小时前
【Day14-单例设计模式&动态代理】
java·开发语言·笔记·学习·设计模式·学习经验
coffee_baby7 小时前
外观模式详解:如何为复杂系统构建简洁的接口
java·spring boot·spring cloud·java-ee·maven·mybatis·外观模式
-凌凌漆-16 小时前
【设计模式】装饰模式
设计模式
蔚一16 小时前
Java设计模式—面向对象设计原则(一) ----->开闭原则OCP(完整详解,附有代码+案例)
java·后端·设计模式·intellij-idea·开闭原则
丶白泽19 小时前
重修设计模式-结构型-代理模式
设计模式·系统安全·代理模式
Java__攻城狮21 小时前
java设计模式(持续更新中)
java·开发语言·设计模式