祗疼妳一个 发表于 2025-4-2 11:17:52

外观模式详解

以下是一个团结外观模式解决实际开辟题目的Java实现案例,涵盖复杂系统整合、接口简化、版本兼容等场景需求,附带逐行中文注释:
场景描述

开辟一个智能家居控制系统,需整合多个子系统:
灯光系统:多房间灯光控制
空调系统:温度模式调节
影音系统:多媒体设备管理
安防系统:门窗传感器监控
核心痛点:
客户端必要相识每个子系统接口
多设备联动操作复杂(如"离家模式"需关闭全部设备并启动安防)
子系统升级导致客户端频仍修改
完整代码实现(逐行注释)
import java.util.List;

// ================== 子系统类 ==================

/**
* 灯光子系统
*/
class LightingSystem {
    public void switchRoomLight(String room, boolean on) {
      System.out.println((on ? "开启" : "关闭") + room + "灯光");
    }
   
    public void setBrightness(String room, int percent) {
      System.out.println("设置" + room + "灯光亮度至" + percent + "%");
    }
}

/**
* 空调子系统
*/
class AirConditioningSystem {
    public void setTemperature(float temp) {
      System.out.println("设置空调温度:" + temp + "℃");
    }
   
    public void setMode(String mode) {
      System.out.println("设置空调模式:" + mode);
    }
}

/**
* 影音子系统
*/
class EntertainmentSystem {
    public void playMusic(String song) {
      System.out.println("播放音乐:" + song);
    }
   
    public void stopMusic() {
      System.out.println("停止音乐播放");
    }
   
    public void startMovieMode() {
      System.out.println("启动影院模式");
    }
}

/**
* 安防子系统(新版本接口)
*/
class SecuritySystem {
    public void armSystem() {
      System.out.println("启动全屋安防系统");
    }
   
    public void disarmSystem() {
      System.out.println("关闭安防系统");
    }
   
    public List<String> getSensorStatus() {
      return List.of("前门:正常", "后窗:正常");
    }
}

// ================== 外观类 ==================

/**
* 智能家居外观(核心整合类)
*/
class SmartHomeFacade {
    // 子系统实例(可替换为接口实现依赖注入)
    private final LightingSystem lighting;
    private final AirConditioningSystem ac;
    private final EntertainmentSystem entertainment;
    private final SecuritySystem security;
   
    public SmartHomeFacade() {
      this.lighting = new LightingSystem();
      this.ac = new AirConditioningSystem();
      this.entertainment = new EntertainmentSystem();
      this.security = new SecuritySystem();
    }
   
    // ------------------- 场景模式 -------------------
   
    /**
   * 离家模式(解耦新旧系统差异)
   */
    public void leaveHome() {
      System.out.println("\n=== 启动离家模式 ===");
      lighting.switchRoomLight("客厅", false);
      lighting.switchRoomLight("卧室", false);
      ac.setMode("节能");
      entertainment.stopMusic();
      security.armSystem();
      checkSecurityStatus();
    }
   
    /**
   * 回家模式
   */
    public void backHome() {
      System.out.println("\n=== 启动回家模式 ===");
      security.disarmSystem();
      lighting.switchRoomLight("玄关", true);
      lighting.setBrightness("客厅", 70);
      ac.setTemperature(25.5f);
      entertainment.playMusic("欢迎回家");
    }
   
    /**
   * 影院模式
   */
    public void startMovieNight() {
      System.out.println("\n=== 启动影院模式 ===");
      lighting.switchRoomLight("客厅", true);
      lighting.setBrightness("客厅", 20);
      ac.setTemperature(24.0f);
      ac.setMode("静音");
      entertainment.startMovieMode();
    }
   
    // ------------------- 工具方法 -------------------
   
    private void checkSecurityStatus() {
      List<String> status = security.getSensorStatus();
      System.out.println("安防状态检查:");
      status.forEach(System.out::println);
    }
   
    // ------------------- 适配旧版接口(解决版本兼容问题) -------------------
    /**
   * 旧版空调接口适配方法
   * @param level 1-低温 2-中温 3-高温
   */
    public void legacySetACLevel(int level) {
      float[] temps = {20.0f, 24.0f, 28.0f};
      ac.setTemperature(temps);
    }
}

// ================== 客户端代码 ==================
public class FacadePatternDemo {
    public static void main(String[] args) {
      SmartHomeFacade smartHome = new SmartHomeFacade();
      
      // 场景模式调用
      smartHome.backHome();// 回家模式
      smartHome.startMovieNight();// 影院模式
      smartHome.leaveHome();// 离家模式
      
      // 兼容旧版接口调用
      System.out.println("\n=== 旧版空调设置 ===");
      smartHome.legacySetACLevel(2);// 中温
    }
}
架构计划发起

分层实现
┌───────────────┐
│   客户端代码    │
└──────┬────────┘
       │
┌──────▼────────┐
│ 外观层(Facade) │
└──────┬────────┘
       │
┌──────▼────────┐
│ 子系统层(Subsystems)│
└──────────────────┘
接口计划原则
最少知识原则:外观方法不应暴露不必要的子系统细节
稳定性原则:外观接口应比子系统接口更稳定
正交性原则:不同场景方法之间保持功能独立
演进策略
初期为简单外观
随系统复杂化发展为门面集群
终极可能形成层次化外观体系
通过这个案例可以看出,外观模式在复杂系统整合和接口简化场景中具有重要价值。实际开辟中发起:
识别稳定点:外观接口应封装最稳定的业务概念
控制粒度:避免外观类成为"上帝对象"
团结其他模式:如工厂模式创建外观实例
版本管理:为庞大升级维护多版本外观类
一句话总结

门面模式主要是为相识决对外暴露接口的细节题目,通过门面的方式隐蔽细节。与适配器模式不同的是,适配器模式主要是当前子系统对外部调用接口进行适配,而门面模式是内部接口开给外部的细节隐蔽。门面模式是帮别人适配,适配器模式是我适配别人。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 外观模式详解