外观模式详解

打印 上一主题 下一主题

主题 1782|帖子 1782|积分 5348

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

开辟一个智能家居控制系统,需整合多个子系统:
灯光系统:多房间灯光控制
空调系统:温度模式调节
影音系统:多媒体设备管理
安防系统:门窗传感器监控
核心痛点:
客户端必要相识每个子系统接口
多设备联动操作复杂(如"离家模式"需关闭全部设备并启动安防)
子系统升级导致客户端频仍修改
完整代码实现(逐行注释)
  1. import java.util.List;
  2. // ================== 子系统类 ==================
  3. /**
  4. * 灯光子系统
  5. */
  6. class LightingSystem {
  7.     public void switchRoomLight(String room, boolean on) {
  8.         System.out.println((on ? "开启" : "关闭") + room + "灯光");
  9.     }
  10.    
  11.     public void setBrightness(String room, int percent) {
  12.         System.out.println("设置" + room + "灯光亮度至" + percent + "%");
  13.     }
  14. }
  15. /**
  16. * 空调子系统
  17. */
  18. class AirConditioningSystem {
  19.     public void setTemperature(float temp) {
  20.         System.out.println("设置空调温度:" + temp + "℃");
  21.     }
  22.    
  23.     public void setMode(String mode) {
  24.         System.out.println("设置空调模式:" + mode);
  25.     }
  26. }
  27. /**
  28. * 影音子系统
  29. */
  30. class EntertainmentSystem {
  31.     public void playMusic(String song) {
  32.         System.out.println("播放音乐:" + song);
  33.     }
  34.    
  35.     public void stopMusic() {
  36.         System.out.println("停止音乐播放");
  37.     }
  38.    
  39.     public void startMovieMode() {
  40.         System.out.println("启动影院模式");
  41.     }
  42. }
  43. /**
  44. * 安防子系统(新版本接口)
  45. */
  46. class SecuritySystem {
  47.     public void armSystem() {
  48.         System.out.println("启动全屋安防系统");
  49.     }
  50.    
  51.     public void disarmSystem() {
  52.         System.out.println("关闭安防系统");
  53.     }
  54.    
  55.     public List<String> getSensorStatus() {
  56.         return List.of("前门:正常", "后窗:正常");
  57.     }
  58. }
  59. // ================== 外观类 ==================
  60. /**
  61. * 智能家居外观(核心整合类)
  62. */
  63. class SmartHomeFacade {
  64.     // 子系统实例(可替换为接口实现依赖注入)
  65.     private final LightingSystem lighting;
  66.     private final AirConditioningSystem ac;
  67.     private final EntertainmentSystem entertainment;
  68.     private final SecuritySystem security;
  69.    
  70.     public SmartHomeFacade() {
  71.         this.lighting = new LightingSystem();
  72.         this.ac = new AirConditioningSystem();
  73.         this.entertainment = new EntertainmentSystem();
  74.         this.security = new SecuritySystem();
  75.     }
  76.    
  77.     // ------------------- 场景模式 -------------------
  78.    
  79.     /**
  80.      * 离家模式(解耦新旧系统差异)
  81.      */
  82.     public void leaveHome() {
  83.         System.out.println("\n=== 启动离家模式 ===");
  84.         lighting.switchRoomLight("客厅", false);
  85.         lighting.switchRoomLight("卧室", false);
  86.         ac.setMode("节能");
  87.         entertainment.stopMusic();
  88.         security.armSystem();
  89.         checkSecurityStatus();
  90.     }
  91.    
  92.     /**
  93.      * 回家模式
  94.      */
  95.     public void backHome() {
  96.         System.out.println("\n=== 启动回家模式 ===");
  97.         security.disarmSystem();
  98.         lighting.switchRoomLight("玄关", true);
  99.         lighting.setBrightness("客厅", 70);
  100.         ac.setTemperature(25.5f);
  101.         entertainment.playMusic("欢迎回家");
  102.     }
  103.    
  104.     /**
  105.      * 影院模式
  106.      */
  107.     public void startMovieNight() {
  108.         System.out.println("\n=== 启动影院模式 ===");
  109.         lighting.switchRoomLight("客厅", true);
  110.         lighting.setBrightness("客厅", 20);
  111.         ac.setTemperature(24.0f);
  112.         ac.setMode("静音");
  113.         entertainment.startMovieMode();
  114.     }
  115.    
  116.     // ------------------- 工具方法 -------------------
  117.    
  118.     private void checkSecurityStatus() {
  119.         List<String> status = security.getSensorStatus();
  120.         System.out.println("安防状态检查:");
  121.         status.forEach(System.out::println);
  122.     }
  123.    
  124.     // ------------------- 适配旧版接口(解决版本兼容问题) -------------------
  125.     /**
  126.      * 旧版空调接口适配方法
  127.      * @param level 1-低温 2-中温 3-高温
  128.      */
  129.     public void legacySetACLevel(int level) {
  130.         float[] temps = {20.0f, 24.0f, 28.0f};
  131.         ac.setTemperature(temps[level - 1]);
  132.     }
  133. }
  134. // ================== 客户端代码 ==================
  135. public class FacadePatternDemo {
  136.     public static void main(String[] args) {
  137.         SmartHomeFacade smartHome = new SmartHomeFacade();
  138.         
  139.         // 场景模式调用
  140.         smartHome.backHome();  // 回家模式
  141.         smartHome.startMovieNight();  // 影院模式
  142.         smartHome.leaveHome();  // 离家模式
  143.         
  144.         // 兼容旧版接口调用
  145.         System.out.println("\n=== 旧版空调设置 ===");
  146.         smartHome.legacySetACLevel(2);  // 中温
  147.     }
  148. }
复制代码
架构计划发起

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

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

祗疼妳一个

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表