【设计模式】外观模式

发布于:2025-04-10 ⋅ 阅读:(36) ⋅ 点赞:(0)

简介

想象你要在家里看电影,需要做以下操作:

  1. 打开电视
  2. 启动音响
  3. 调暗灯光
  4. 关闭窗帘

如果每次都要手动操作这些步骤会很麻烦。外观模式可以帮你将这些步骤封装成一个统一的接口,比如“一键观影模式”,你只需按一个按钮,系统就会自动完成所有操作。

适用场景

  1. 简化复杂子系统:当子系统有大量复杂的接口时,用外观模式提供统一入口。
  2. 分层设计:将子系统划分为多个层次,外观作为每层的入口。
  3. 减少依赖:客户端只需依赖外观,无需直接调用子系统。

优点

  1. 简化客户端调用,降低使用复杂度。
  2. 减少客户端与子系统的耦合,提高灵活性。
  3. 易于维护,子系统变化只需修改外观类。

缺点

  1. 外观类可能成为“上帝对象”(过于庞大)。
  2. 不符合开闭原则,子系统变更可能需要修改外观类。

类图

在这里插入图片描述

代码

// 子系统:电视

class TV {

    void turnOn() { System.out.println("电视打开"); }

}

  

// 子系统:音响

class SoundSystem {

    void on() { System.out.println("音响启动"); }

}

  

// 子系统:灯光

class Lighting {

    void dim() { System.out.println("灯光调暗"); }

}

  

// 外观类

class HomeTheaterFacade {

    private TV tv;

    private SoundSystem sound;

    private Lighting lighting;

  

    public HomeTheaterFacade() {

        this.tv = new TV();

        this.sound = new SoundSystem();

        this.lighting = new Lighting();

    }

  

    public void watchMovie() {

        tv.turnOn();

        sound.on();

        lighting.dim();

    }

}

  

// 客户端

public class Client {

    public static void main(String[] args) {

        HomeTheaterFacade facade = new HomeTheaterFacade();

        facade.watchMovie();

    }

}

案例

文件上传需要:验证文件格式、压缩文件、存储到云服务器。

// 子系统:文件验证

class FileValidator {

    void validate(String file) { System.out.println("验证文件: " + file); }

}

  

// 子系统:压缩工具

class Compressor {

    void compress(String file) { System.out.println("压缩文件: " + file); }

}

  

// 子系统:云存储

class CloudStorage {

    void upload(String file) { System.out.println("上传文件: " + file); }

}

  

// 外观类

class FileUploadFacade {

    private FileValidator validator;

    private Compressor compressor;

    private CloudStorage storage;

  

    public FileUploadFacade() {

        this.validator = new FileValidator();

        this.compressor = new Compressor();

        this.storage = new CloudStorage();

    }

  

    public void uploadFile(String file) {

        validator.validate(file);

        compressor.compress(file);

        storage.upload(file);

    }

}

  

// 客户端

public class Client {

    public static void main(String[] args) {

        FileUploadFacade facade = new FileUploadFacade();

        facade.uploadFile("data.csv");

    }

}


网站公告

今日签到

点亮在社区的每一天
去签到