You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
print/TRAEPrincipleDemo.java

808 lines
35 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* TRAE原则演示类
* 展示Testability(可测试性)、Reusability(可重用性)、Accessibility(可访问性)、Extensibility(可扩展性)
*/
import com.smart.home.basic.DeviceManager;
import com.smart.home.basic.SmartDevice;
import com.smart.home.basic.PowerControl;
import com.smart.home.advanced.SmartDoor;
import com.smart.home.advanced.SmartSafe;
import com.smart.home.advanced.Lockable;
import com.smart.home.advanced.Monitored;
import com.smart.home.advanced.Alarmable;
import com.smart.home.advanced.SecurityCamera;
import com.smart.home.challenge.SmartLightBulb;
import com.smart.home.challenge.SmartAirConditioner;
import com.smart.home.challenge.SmartSpeaker;
import com.smart.home.challenge.SmartCurtain;
import java.util.List;
import java.util.ArrayList;
import java.util.Optional;
/**
* 智能设备测试工具类
* 提供通用的设备测试方法,展示工厂方法模式的应用
*/
class DeviceTestUtil {
// 工厂方法:创建设备管理器
public static DeviceManager createDeviceManager() {
return new DeviceManager();
}
// 通用测试方法:验证设备状态
public static void verifyDeviceStatus(SmartDevice device, String expectedStatus) {
String actualStatus = device.getStatusDescription();
System.out.println(" - 验证状态: " + actualStatus);
if (actualStatus.contains(expectedStatus)) {
System.out.println(" * 状态验证通过");
} else {
System.out.println(" * 状态验证失败,期望包含: " + expectedStatus);
}
}
}
public class TRAEPrincipleDemo {
/**
* 主方法
* @param args 命令行参数
*/
public static void main(String[] args) {
System.out.println("===== TRAE原则程序测验 =====");
System.out.println("TRAE: Testability(可测试性)、Reusability(可重用性)、Accessibility(可访问性)、Extensibility(可扩展性)");
// 1. 可测试性 (Testability) 演示
demonstrateTestability();
// 2. 可重用性 (Reusability) 演示
demonstrateReusability();
// 3. 可访问性 (Accessibility) 演示
demonstrateAccessibility();
// 4. 可扩展性 (Extensibility) 演示
demonstrateExtensibility();
System.out.println("\n===== TRAE原则测验完成 =====");
}
/**
* 演示可测试性 (Testability)
* 通过接口隔离和依赖注入实现易于测试的设计
* 增强了异常处理和参数验证以提高代码健壮性
*/
private static void demonstrateTestability() {
System.out.println("\n1. 可测试性 (Testability) 演示:");
System.out.println(" - 使用接口隔离原则,每个接口职责单一,易于模拟测试");
System.out.println(" - 通过接口实现松耦合,便于单元测试和集成测试");
System.out.println(" - 增加异常处理和参数验证,提高测试健壮性");
// 测试场景1: 智能设备基本功能测试
System.out.println(" 测试场景1: 智能灯光控制功能测试");
try {
// 使用工厂方法创建测试对象,符合依赖注入原则
DeviceManager testManager = DeviceTestUtil.createDeviceManager();
// 参数验证示例
String deviceId = "TEST_LIGHT";
String deviceName = "测试灯泡";
if (deviceId == null || deviceId.trim().isEmpty()) {
throw new IllegalArgumentException("设备ID不能为空");
}
SmartLightBulb testLight = new SmartLightBulb(deviceId, deviceName);
testManager.addDevice(testLight);
// 验证初始状态
System.out.println(" - 初始状态测试: " + testLight.getStatusDescription());
// 执行测试操作
System.out.println(" - 执行测试操作...");
testManager.turnOnDevice(deviceId);
// 参数边界测试
testLight.setBrightness(0); // 边界值测试
System.out.println(" - 亮度边界值测试(0%): " + testLight.getStatusDescription());
testLight.setBrightness(100); // 边界值测试
System.out.println(" - 亮度边界值测试(100%): " + testLight.getStatusDescription());
// 正常值测试
testLight.setBrightness(75);
testLight.setColor("蓝色");
// 使用工具类验证状态
DeviceTestUtil.verifyDeviceStatus(testLight, "蓝色");
DeviceTestUtil.verifyDeviceStatus(testLight, "75%");
} catch (IllegalArgumentException e) {
System.out.println(" - 参数验证异常: " + e.getMessage());
} catch (Exception e) {
System.out.println(" - 测试过程中出现异常: " + e.getMessage());
}
// 测试场景2: 安全设备功能测试和异常处理
System.out.println("\n 测试场景2: 智能门锁安全功能测试");
try {
SmartDoor testDoor = new SmartDoor("测试门锁");
// 使用断言进行状态验证
boolean initialLockedState = testDoor.isLocked();
System.out.println(" - 初始锁定状态: " + initialLockedState);
// 测试锁定/解锁功能
System.out.println(" - 执行锁定操作");
testDoor.lock();
System.out.println(" - 锁定后状态: " + testDoor.isLocked());
System.out.println(" - 执行解锁操作");
testDoor.unlock();
System.out.println(" - 解锁后状态: " + testDoor.isLocked());
// 测试边界条件和异常场景
System.out.println(" - 重复锁定测试:");
testDoor.lock(); // 先锁定
testDoor.lock(); // 重复锁定
// 演示异常情况处理
System.out.println(" - 演示异常状态处理");
// 假设尝试在已锁定状态下执行某些操作
} catch (SecurityException e) {
System.out.println(" - 安全异常: " + e.getMessage());
} catch (Exception e) {
System.out.println(" - 测试异常: " + e.getMessage());
}
// 测试场景3: 空值和边界情况测试
System.out.println("\n 测试场景3: 空值和边界情况测试");
try {
DeviceManager nullTestManager = DeviceTestUtil.createDeviceManager();
// 测试设备不存在的情况
System.out.println(" - 测试设备不存在场景...");
nullTestManager.turnOnDevice("NON_EXISTENT_DEVICE");
} catch (IllegalArgumentException e) {
System.out.println(" - 预期的异常捕获: " + e.getMessage());
}
System.out.println(" \n结论通过接口编程和职责单一原则实现了组件间的松耦合提高了可测试性");
System.out.println(" - 每个接口职责明确,便于模拟和测试");
System.out.println(" - 组件间依赖通过接口而非具体实现,便于替换测试对象");
System.out.println(" - 添加异常处理和参数验证,提高了测试的健壮性");
System.out.println(" - 使用工具类封装通用测试方法,减少代码重复");
}
/**
* 演示可重用性 (Reusability)
* 通过接口组合实现功能的复用,并应用策略模式和装饰器模式
*/
private static void demonstrateReusability() {
System.out.println("\n2. 可重用性 (Reusability) 演示:");
System.out.println(" - 接口可以被多个不同的类重用实现");
System.out.println(" - 不同类型的接口在不同设备上的复用");
System.out.println(" - 策略模式和装饰器模式的应用增强了代码的可重用性");
try {
// 使用工厂方法创建设备管理器
DeviceManager manager = DeviceTestUtil.createDeviceManager();
// 演示1: 策略模式 - PowerControl接口的重用
System.out.println(" 演示1: 策略模式 - PowerControl接口的重用");
// 创建不同的设备实现相同接口
SmartAirConditioner ac = new SmartAirConditioner("AC001", "客厅空调");
SmartLightBulb light = new SmartLightBulb("LIGHT001", "卧室灯");
// 参数验证
if (ac == null || light == null) {
throw new IllegalArgumentException("设备对象创建失败");
}
manager.addDevice(ac);
manager.addDevice(light);
// 通过相同的接口方法控制不同设备 - 策略模式应用
System.out.println(" - 使用统一电源控制策略操作不同设备");
powerControlStrategy(ac, true);
powerControlStrategy(light, true);
// 演示2: Lockable接口的重用和装饰器模式
System.out.println("\n 演示2: 装饰器模式 - Lockable接口的增强复用");
SmartDoor frontDoor = new SmartDoor("前门智能锁");
SmartSafe safe = new SmartSafe("保险箱");
// 使用增强的锁定策略
lockableStrategy(frontDoor, true, "标准安全级别");
lockableStrategy(safe, true, "高级安全级别");
// 演示3: 状态检查方法的重用和结果格式化
System.out.println("\n 演示3: 统一状态报告策略:");
reportLockStatus(frontDoor);
reportLockStatus(safe);
// 演示4: 混合接口组合复用
System.out.println("\n 演示4: 混合接口组合复用:");
List<SmartDevice> devices = new ArrayList<>();
devices.add(ac);
devices.add(light);
devices.add(frontDoor);
// 统一处理不同接口能力的设备
processMixedDevices(devices);
} catch (IllegalArgumentException e) {
System.out.println(" - 参数验证异常: " + e.getMessage());
} catch (Exception e) {
System.out.println(" - 可重用性演示异常: " + e.getMessage());
}
System.out.println(" \n结论接口的复用使得系统组件可以被多种场景使用减少代码冗余");
System.out.println(" - 策略模式允许在运行时选择算法或行为");
System.out.println(" - 装饰器模式允许动态地向对象添加额外的责任");
System.out.println(" - 统一接口减少了重复代码,提高了系统的可维护性");
System.out.println(" - 异常处理和参数验证增强了代码的健壮性");
}
/**
* 电源控制策略 - 策略模式实现
* @param device 支持电源控制的设备
* @param turnOn 是否开启设备
*/
private static void powerControlStrategy(PowerControl device, boolean turnOn) {
if (turnOn) {
device.turnOn();
System.out.println(" * 设备已开启");
} else {
device.turnOff();
System.out.println(" * 设备已关闭");
}
}
/**
* 锁定策略 - 装饰器模式实现
* @param device 支持锁定的设备
* @param lock 是否锁定
* @param securityLevel 安全级别
*/
private static void lockableStrategy(Lockable device, boolean lock, String securityLevel) {
System.out.println(" * 应用" + securityLevel + "锁定策略");
if (lock) {
device.lock();
System.out.println(" * 执行锁定操作");
} else {
device.unlock();
System.out.println(" * 执行解锁操作");
}
// 装饰器模式 - 添加额外的日志记录功能
System.out.println(" * 安全操作记录已生成");
}
/**
* 统一锁定状态报告
* @param device 支持锁定的设备
*/
private static void reportLockStatus(Lockable device) {
String status = device.isLocked() ? "已锁定" : "已解锁";
// 假设device有getName方法
String deviceName = "设备";
if (device instanceof SmartDevice) {
deviceName = ((SmartDevice)device).getDeviceName();
}
System.out.println(" * " + deviceName + " 锁定状态: " + status);
}
/**
* 处理混合设备集合 - 展示适配器模式思想
* @param devices 设备列表
*/
private static void processMixedDevices(List<SmartDevice> devices) {
System.out.println(" * 处理混合设备集合:");
for (SmartDevice device : devices) {
System.out.println(" * " + device.getDeviceName() + ":");
// 根据设备实现的接口执行不同操作
if (device instanceof PowerControl) {
System.out.println(" - 支持电源控制");
}
if (device instanceof Lockable) {
System.out.println(" - 支持锁定控制");
}
}
}
/**
* 演示可访问性 (Accessibility)
* 通过统一的接口使系统组件易于访问和使用
* 增强了适配器模式和观察者模式的应用
*/
private static void demonstrateAccessibility() {
System.out.println("\n3. 可访问性 (Accessibility) 演示:");
System.out.println(" - 所有设备实现了SmartDevice接口提供统一的访问方式");
System.out.println(" - DeviceManager提供了统一的设备管理和访问入口");
System.out.println(" - 适配器模式和观察者模式增强了系统的可访问性");
try {
// 创建混合设备场景
DeviceManager manager = DeviceTestUtil.createDeviceManager();
// 添加不同类型的设备
DeviceAdapter deviceAdapter = new DeviceAdapter();
deviceAdapter.addDevice(manager, "SPK001", "智能音箱", "SmartSpeaker");
deviceAdapter.addDevice(manager, "AC003", "卧室空调", "SmartAirConditioner");
deviceAdapter.addDevice(manager, "LIGHT003", "客厅灯", "SmartLightBulb");
// 获取所有设备
List<SmartDevice> allDevices = Optional.ofNullable(manager.getAllDevices())
.orElseThrow(() -> new IllegalStateException("无法获取设备列表"));
if (allDevices.isEmpty()) {
System.out.println(" - 警告: 设备列表为空");
return;
}
// 创建设备状态监听器 - 观察者模式
DeviceStatusObserver statusObserver = new DeviceStatusObserver();
// 演示1: 通过统一接口访问不同设备信息 - 适配器模式
System.out.println(" 演示1: 设备信息适配器模式:");
deviceInfoAdapter(allDevices);
// 演示2: 通过接口类型识别和访问特定功能 - 命令模式
System.out.println("\n 演示2: 功能访问命令模式:");
executeDeviceCommand(allDevices, "powerOn");
// 演示3: 设备状态变化通知 - 观察者模式
System.out.println("\n 演示3: 设备状态观察模式:");
// 注册设备状态变化通知
statusObserver.registerDevices(allDevices);
// 改变设备状态,触发观察者通知
for (SmartDevice device : allDevices) {
if (device instanceof PowerControl) {
((PowerControl) device).turnOff();
// 模拟状态变化通知
statusObserver.notifyStatusChanged(device, "关闭");
}
}
// 演示4: 设备信息过滤和查询 - 过滤器模式
System.out.println("\n 演示4: 设备过滤查询模式:");
filterAndQueryDevices(allDevices, "空调");
} catch (IllegalArgumentException e) {
System.out.println(" - 参数错误: " + e.getMessage());
} catch (IllegalStateException e) {
System.out.println(" - 系统错误: " + e.getMessage());
} catch (Exception e) {
System.out.println(" - 访问性演示异常: " + e.getMessage());
}
System.out.println(" \n结论统一接口提供了一致的访问方式降低了使用复杂度");
System.out.println(" - 适配器模式简化了不同设备接口的访问方式");
System.out.println(" - 观察者模式实现了设备状态变化的实时通知");
System.out.println(" - 命令模式封装了设备操作,提高了代码的可维护性");
System.out.println(" - 过滤器模式优化了设备查询和访问体验");
System.out.println(" - 异常处理和参数验证增强了系统的健壮性");
}
/**
* 设备适配器类 - 适配器模式实现
* 统一不同设备的创建和管理方式
*/
static class DeviceAdapter {
public void addDevice(DeviceManager manager, String deviceId, String deviceName, String deviceType) {
try {
SmartDevice device = null;
// 根据设备类型创建不同的设备实例
switch (deviceType) {
case "SmartSpeaker":
device = new SmartSpeaker(deviceId, deviceName);
break;
case "SmartAirConditioner":
device = new SmartAirConditioner(deviceId, deviceName);
break;
case "SmartLightBulb":
device = new SmartLightBulb(deviceId, deviceName);
break;
default:
throw new IllegalArgumentException("不支持的设备类型: " + deviceType);
}
if (device != null) {
manager.addDevice(device);
System.out.println(" * 已添加" + deviceName);
}
} catch (Exception e) {
System.out.println(" * 设备添加失败: " + e.getMessage());
}
}
}
/**
* 设备状态观察者 - 观察者模式实现
* 监听和处理设备状态变化
*/
static class DeviceStatusObserver {
public void registerDevices(List<SmartDevice> devices) {
System.out.println(" * 已注册设备状态观察者");
}
public void notifyStatusChanged(SmartDevice device, String newStatus) {
System.out.println(" * 状态通知: " + device.getDeviceName() + " 状态变为 " + newStatus);
}
}
/**
* 设备信息适配器方法
* 统一格式输出设备信息
*/
private static void deviceInfoAdapter(List<SmartDevice> devices) {
System.out.println(" * 设备信息标准化输出:");
for (SmartDevice device : devices) {
try {
System.out.println(" * 设备信息卡:");
System.out.println(" - 名称: " + device.getDeviceName());
System.out.println(" - ID: " + device.getDeviceId());
System.out.println(" - 类型: " + device.getDeviceType());
System.out.println(" - 状态: " + device.getStatusDescription());
} catch (Exception e) {
System.out.println(" - 获取设备信息时出错: " + e.getMessage());
}
}
}
/**
* 设备命令执行器 - 命令模式
* 统一执行不同设备的操作命令
*/
private static void executeDeviceCommand(List<SmartDevice> devices, String command) {
System.out.println(" * 执行命令: " + command);
for (SmartDevice device : devices) {
try {
switch (command) {
case "powerOn":
if (device instanceof PowerControl) {
((PowerControl) device).turnOn();
System.out.println(" - " + device.getDeviceName() + " 已开启");
}
break;
case "powerOff":
if (device instanceof PowerControl) {
((PowerControl) device).turnOff();
System.out.println(" - " + device.getDeviceName() + " 已关闭");
}
break;
default:
System.out.println(" - 未知命令: " + command);
}
} catch (Exception e) {
System.out.println(" - 执行命令失败: " + e.getMessage());
}
}
}
/**
* 设备过滤和查询 - 过滤器模式
* 根据条件过滤和查询设备
*/
private static void filterAndQueryDevices(List<SmartDevice> devices, String keyword) {
System.out.println(" * 过滤条件: 名称包含'" + keyword + "'");
boolean found = false;
for (SmartDevice device : devices) {
try {
if (device.getDeviceName().contains(keyword)) {
System.out.println(" - 找到匹配设备: " + device.getDeviceName());
found = true;
}
} catch (Exception e) {
System.out.println(" - 过滤设备时出错: " + e.getMessage());
}
}
if (!found) {
System.out.println(" - 未找到匹配设备");
}
}
}
/**
* 演示可扩展性 (Extensibility)
* 通过接口隔离和组合实现系统的轻松扩展
* 增强了模板方法模式、工厂方法模式和责任链模式的应用
*/
private static void demonstrateExtensibility() {
System.out.println("\n4. 可扩展性 (Extensibility) 演示:");
System.out.println(" - 接口隔离原则使系统可以在不修改现有代码的情况下扩展");
System.out.println(" - 设备可以根据需要组合实现多个接口,实现功能的灵活组合");
System.out.println(" - 应用多种设计模式增强系统扩展性");
try {
// 使用工厂方法创建设备管理器
DeviceManager manager = DeviceTestUtil.createDeviceManager();
// 设备创建工厂
SmartDeviceFactory deviceFactory = new SmartDeviceFactory();
// 添加基础设备
manager.addDevice(deviceFactory.createDevice("AC002", "书房空调", "SmartAirConditioner"));
manager.addDevice(deviceFactory.createDevice("LIGHT002", "厨房灯", "SmartLightBulb"));
// ===== 演示1: 模板方法模式 - 设备初始化流程 =====
System.out.println(" 演示1: 模板方法模式 - 设备初始化流程:");
// 创建智能窗帘并使用模板方法初始化
SmartCurtain livingRoomCurtain = new SmartCurtain("CURTAIN001", "客厅窗帘");
DeviceInitializationTemplate curtainInit = new CurtainInitialization(livingRoomCurtain);
// 使用模板方法执行标准初始化流程
curtainInit.initializeDevice();
manager.addDevice(livingRoomCurtain);
// 演示智能窗帘特有的功能
System.out.println(" - 智能窗帘特有功能操作:");
manager.turnOnDevice("CURTAIN001");
livingRoomCurtain.openCurtain();
livingRoomCurtain.setCurtainPosition(50); // 设置窗帘位置为50%
DeviceTestUtil.verifyDeviceStatus(livingRoomCurtain, "50%");
// ===== 演示2: 责任链模式 - 多级安全设备处理 =====
System.out.println("\n 演示2: 责任链模式 - 多级安全设备处理:");
// 创建安全处理责任链
SecurityHandler cameraHandler = new CameraSecurityHandler();
SecurityHandler safeHandler = new SafeSecurityHandler();
// 构建责任链
cameraHandler.setNextHandler(safeHandler);
// 创建安全设备
SecurityCamera livingRoomCamera = new SecurityCamera("客厅摄像头");
SmartSafe mainSafe = new SmartSafe("主卧保险箱");
// 使用责任链处理不同安全设备
System.out.println(" - 执行安全设备初始化责任链:");
cameraHandler.handleSecurity(livingRoomCamera);
cameraHandler.handleSecurity(mainSafe);
// 演示各设备功能
System.out.println(" - 监控设备功能测试:");
livingRoomCamera.startMonitoring();
System.out.println(" * " + livingRoomCamera.getMonitoringStatus());
System.out.println(" - 报警功能测试:");
livingRoomCamera.setAlarmSensitivity(8);
livingRoomCamera.triggerAlarm();
livingRoomCamera.stopAlarm();
// ===== 演示3: 工厂方法模式 - 动态创建设备 =====
System.out.println("\n 演示3: 工厂方法模式 - 动态创建设备:");
// 动态创建新类型设备
SmartDevice newDevice = deviceFactory.createDevice("NEW_DEVICE", "新功能设备", "Unknown");
if (newDevice != null) {
manager.addDevice(newDevice);
System.out.println(" * 新设备已添加: " + newDevice.getDeviceName());
}
// ===== 演示4: 原型模式 - 设备复制与定制 =====
System.out.println("\n 演示4: 原型模式 - 设备复制与定制:");
// 尝试复制现有设备并定制
SmartDevice copiedDevice = deviceFactory.cloneDevice(livingRoomCurtain, "CURTAIN002", "卧室窗帘");
if (copiedDevice instanceof SmartCurtain) {
manager.addDevice(copiedDevice);
((SmartCurtain) copiedDevice).setCurtainPosition(25);
System.out.println(" * 复制设备状态: " + copiedDevice.getStatusDescription());
}
// 展示所有智能设备的状态 - 使用观察者模式通知
System.out.println("\n 所有智能设备列表和状态:");
List<SmartDevice> allDevices = Optional.ofNullable(manager.getAllDevices())
.orElse(new ArrayList<>());
DeviceStatusObserver observer = new DeviceStatusObserver();
observer.registerDevices(allDevices);
for (SmartDevice device : allDevices) {
try {
System.out.println(" - " + device.getDeviceName() + ": " + device.getStatusDescription());
// 模拟状态通知
observer.notifyStatusChanged(device, "已加载");
} catch (Exception e) {
System.out.println(" - 获取" + device.getDeviceName() + "状态时出错: " + e.getMessage());
}
}
} catch (IllegalArgumentException e) {
System.out.println(" - 参数错误: " + e.getMessage());
} catch (Exception e) {
System.out.println(" - 扩展性演示异常: " + e.getMessage());
}
System.out.println(" \n结论基于接口的设计实现了出色的可扩展性");
System.out.println(" - 开闭原则:系统对扩展开放,对修改关闭");
System.out.println(" - 接口隔离:每个接口职责单一,设备只需实现必要接口");
System.out.println(" - 组合优于继承:通过接口组合实现功能复用和灵活扩展");
System.out.println(" - 低耦合:新增设备类型不影响现有系统功能");
System.out.println(" - 设计模式:模板方法、工厂方法、责任链等模式进一步增强了可扩展性");
System.out.println(" - 异常处理:完善的异常处理机制提高了系统的健壮性");
}
/**
* 设备初始化模板 - 模板方法模式
* 定义设备初始化的骨架流程
*/
abstract static class DeviceInitializationTemplate {
protected SmartDevice device;
public DeviceInitializationTemplate(SmartDevice device) {
this.device = device;
}
// 模板方法 - 定义初始化流程骨架
public final void initializeDevice() {
System.out.println(" * 开始设备初始化流程");
checkDevice();
configureBasicSettings();
initializeSpecificFeatures();
testFunctionality();
System.out.println(" * 设备初始化完成");
}
// 抽象方法 - 子类实现特定功能初始化
protected abstract void initializeSpecificFeatures();
// 具体方法 - 通用检查步骤
private void checkDevice() {
System.out.println(" - 检查设备连接状态");
}
// 具体方法 - 通用配置步骤
private void configureBasicSettings() {
System.out.println(" - 配置基础参数");
}
// 具体方法 - 通用测试步骤
private void testFunctionality() {
System.out.println(" - 测试设备功能");
}
}
/**
* 窗帘初始化实现 - 模板方法模式具体实现
*/
static class CurtainInitialization extends DeviceInitializationTemplate {
public CurtainInitialization(SmartDevice device) {
super(device);
}
@Override
protected void initializeSpecificFeatures() {
if (device instanceof SmartCurtain) {
SmartCurtain curtain = (SmartCurtain) device;
System.out.println(" - 初始化窗帘特有功能");
System.out.println(" - 设置窗帘初始位置");
curtain.setCurtainPosition(0); // 完全关闭位置
}
}
}
/**
* 智能设备工厂 - 工厂方法模式
* 负责创建各种类型的智能设备
*/
static class SmartDeviceFactory {
public SmartDevice createDevice(String deviceId, String deviceName, String deviceType) {
try {
switch (deviceType) {
case "SmartAirConditioner":
return new SmartAirConditioner(deviceId, deviceName);
case "SmartLightBulb":
return new SmartLightBulb(deviceId, deviceName);
case "SmartSpeaker":
return new SmartSpeaker(deviceId, deviceName);
case "SmartCurtain":
return new SmartCurtain(deviceId, deviceName);
default:
System.out.println(" * 警告: 未知设备类型,返回默认设备");
// 这里可以返回一个默认设备或null取决于系统设计
return null;
}
} catch (Exception e) {
System.out.println(" * 设备创建失败: " + e.getMessage());
return null;
}
}
// 原型模式 - 复制现有设备
public SmartDevice cloneDevice(SmartDevice original, String newId, String newName) {
try {
System.out.println(" * 复制设备: " + original.getDeviceName() + " -> " + newName);
// 根据原始设备类型创建新实例
if (original instanceof SmartCurtain) {
return new SmartCurtain(newId, newName);
} else if (original instanceof SmartLightBulb) {
return new SmartLightBulb(newId, newName);
} else if (original instanceof SmartAirConditioner) {
return new SmartAirConditioner(newId, newName);
} else {
return null;
}
} catch (Exception e) {
System.out.println(" * 设备复制失败: " + e.getMessage());
return null;
}
}
}
/**
* 安全处理器接口 - 责任链模式
*/
interface SecurityHandler {
void setNextHandler(SecurityHandler next);
void handleSecurity(SmartDevice device);
}
/**
* 摄像头安全处理器 - 责任链模式具体实现
*/
static class CameraSecurityHandler implements SecurityHandler {
private SecurityHandler nextHandler;
@Override
public void setNextHandler(SecurityHandler next) {
this.nextHandler = next;
}
@Override
public void handleSecurity(SmartDevice device) {
if (device instanceof SecurityCamera) {
System.out.println(" * 摄像头安全处理器: 处理" + device.getDeviceName());
SecurityCamera camera = (SecurityCamera) device;
camera.setAlarmSensitivity(7); // 默认灵敏度
System.out.println(" - 配置默认监控参数");
} else if (nextHandler != null) {
// 传递给下一个处理器
nextHandler.handleSecurity(device);
}
}
}
/**
* 保险箱安全处理器 - 责任链模式具体实现
*/
static class SafeSecurityHandler implements SecurityHandler {
private SecurityHandler nextHandler;
@Override
public void setNextHandler(SecurityHandler next) {
this.nextHandler = next;
}
@Override
public void handleSecurity(SmartDevice device) {
if (device instanceof SmartSafe) {
System.out.println(" * 保险箱安全处理器: 处理" + device.getDeviceName());
SmartSafe safe = (SmartSafe) device;
safe.lock(); // 默认锁定
System.out.println(" - 设置高级安全级别");
} else if (nextHandler != null) {
// 传递给下一个处理器
nextHandler.handleSecurity(device);
}
}
}
}
}