外观模式详解
以下是一个团结外观模式解决实际开辟题目的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]