# ScreenLockDetector 类图 ## UML 类图 ``` ┌─────────────────────────────────────────────────────────────┐ │ ScreenLockDetector │ │ (工厂类/门面类) │ ├─────────────────────────────────────────────────────────────┤ │ - m_detector: ScreenLockDetectorBase* │ ├─────────────────────────────────────────────────────────────┤ │ + ScreenLockDetector(parent: QObject*) │ │ + ~ScreenLockDetector() │ │ + initialize(): bool │ │ + isScreenLocked(): bool │ │ - createPlatformDetector(): ScreenLockDetectorBase* │ ├─────────────────────────────────────────────────────────────┤ │ signals: │ │ + screenLocked() │ │ + screenUnlocked() │ │ + lockStateChanged(locked: bool) │ └─────────────────────────────────────────────────────────────┘ │ │ creates ▼ ┌─────────────────────────────────────────────────────────────┐ │ ScreenLockDetectorBase (抽象基类) │ │ <> │ ├─────────────────────────────────────────────────────────────┤ │ - m_isLocked: bool │ ├─────────────────────────────────────────────────────────────┤ │ + ScreenLockDetectorBase(parent: QObject*) │ │ + ~ScreenLockDetectorBase() │ │ + isScreenLocked(): bool │ │ + initialize(): bool = 0 <> │ │ # setLockState(locked: bool) │ ├─────────────────────────────────────────────────────────────┤ │ signals: │ │ + screenLocked() │ │ + screenUnlocked() │ │ + lockStateChanged(locked: bool) │ └─────────────────────────────────────────────────────────────┘ △ │ ┌─────────────┴─────────────┐ │ │ │ │ ┌───────────────────────────┐ ┌───────────────────────────┐ │ ScreenLockDetectorLinux │ │ ScreenLockDetectorMacOS │ ├───────────────────────────┤ ├───────────────────────────┤ │ - m_gnomeInterface │ │ - m_observerToken │ │ - m_ukuiInterface │ │ - m_initialized │ │ - m_deepinInterface │ │ │ │ - m_gnomeConnected │ │ │ │ - m_ukuiConnected │ │ │ │ - m_deepinConnected │ │ │ ├───────────────────────────┤ ├───────────────────────────┤ │ + initialize(): bool │ │ + initialize(): bool │ │ - connectToGnome...() │ │ + handleScreenLocked() │ │ - connectToUkui...() │ │ + handleScreenUnlocked() │ │ - connectToDeepinDDE() │ │ + handleScreenSaver...() │ │ - queryCurrentLockState() │ │ - registerNotification..()│ │ - getCurrentSessionPath() │ │ - unregisterNotification()│ ├───────────────────────────┤ ├───────────────────────────┤ │ slots: │ │ (与 Obj-C 观察者交互) │ │ - onScreenSaverActive...()│ │ │ │ - onLockFrontVisible() │ │ │ │ - onSessionLocked() │ │ │ │ - onSessionUnlocked() │ │ │ └───────────────────────────┘ └───────────────────────────┘ │ │ │ uses │ uses ▼ ▼ ┌───────────────────┐ ┌────────────────────────────┐ │ QDBusInterface │ │ NSDistributed │ │ QDBusConnection │ │ NotificationCenter │ │ (Qt DBus API) │ │ (Cocoa Framework) │ └───────────────────┘ └────────────────────────────┘ ``` ## 类关系说明 ### 继承关系 (Inheritance) - `ScreenLockDetectorLinux` 继承自 `ScreenLockDetectorBase` - `ScreenLockDetectorMacOS` 继承自 `ScreenLockDetectorBase` - `ScreenLockDetector` 继承自 `QObject` - `ScreenLockDetectorBase` 继承自 `QObject` ### 组合关系 (Composition) - `ScreenLockDetector` 拥有一个 `ScreenLockDetectorBase*` 成员 - `ScreenLockDetectorLinux` 拥有多个 `QDBusInterface*` 成员 - `ScreenLockDetectorMacOS` 拥有一个 `void*` (Objective-C 对象指针) ### 依赖关系 (Dependency) - `ScreenLockDetectorLinux` 依赖 Qt DBus API - `ScreenLockDetectorMacOS` 依赖 Cocoa Framework API ## 设计模式 ### 1. 工厂方法模式 (Factory Method Pattern) ```cpp ScreenLockDetectorBase* ScreenLockDetector::createPlatformDetector() { // 根据平台创建具体实例 #ifdef Q_OS_MAC return new ScreenLockDetectorMacOS(this); #elif defined(Q_OS_LINUX) return new ScreenLockDetectorLinux(this); #else return nullptr; #endif } ``` **优点:** - 客户端代码不需要知道具体创建哪个类 - 新增平台只需修改工厂方法 - 符合开闭原则 ### 2. 模板方法模式 (Template Method Pattern) ```cpp // 基类定义算法骨架 class ScreenLockDetectorBase { public: virtual bool initialize() = 0; // 留给子类实现 protected: void setLockState(bool locked); // 公共实现 }; // 子类实现具体步骤 class ScreenLockDetectorLinux : public ScreenLockDetectorBase { public: bool initialize() override { // Linux 特定的初始化 connectToGnomeScreenSaver(); connectToDeepinDDE(); // ... } }; ``` **优点:** - 公共逻辑复用(setLockState) - 平台特定逻辑分离(initialize) - 易于维护和扩展 ### 3. 门面模式 (Facade Pattern) ```cpp class ScreenLockDetector { // 为客户端提供简单的接口 // 隐藏内部的平台检测复杂性 private: ScreenLockDetectorBase *m_detector; }; ``` **优点:** - 简化客户端使用 - 隐藏复杂的平台差异 - 提供统一的接口 ## 时序图 ### 初始化流程 ``` 客户端 ScreenLockDetector ScreenLockDetectorBase 平台实现类 │ │ │ │ │ new ScreenLockDetector() │ │ │ │──────────────────────────>│ │ │ │ │ │ │ │ initialize() │ │ │ │──────────────────────────>│ │ │ │ │ │ │ │ │ createPlatformDetector() │ │ │────────────────────────────────────────────>│ │ │ │ new │ │ │<────────────────────────────────────────────│ │ │ │ │ │ │ connect signals │ │ │ │─────────────────────>│ │ │ │ │ │ │ │ initialize() │ │ │ │──────────────────────┼────────────────────>│ │ │ │ connectToXXX() │ │ │ │<────────────────────│ │ │ │ │ │ │<─────────────────────┼─────────────────────│ │<──────────────────────────│ true │ │ │ │ │ │ ``` ### 锁屏事件流程 ``` 系统事件 平台实现类 ScreenLockDetectorBase ScreenLockDetector 客户端 │ │ │ │ │ │ Lock Event │ │ │ │ │────────────────────>│ │ │ │ │ │ │ │ │ │ │ setLockState(true)│ │ │ │ │───────────────────>│ │ │ │ │ │ emit lockStateChanged│ │ │ │ │─────────────────────>│ │ │ │ │ │ emit signal │ │ │ │ │──────────────>│ │ │ │ emit screenLocked │ │ │ │ │─────────────────────>│ │ │ │ │ │ emit signal │ │ │ │ │──────────────>│ │ │ │ │ │ ``` ## 扩展性示例 ### 添加 Windows 平台支持 ``` 1. 创建新类: ScreenLockDetectorWindows : public ScreenLockDetectorBase 2. 实现 initialize() 方法 3. 更新工厂方法: ScreenLockDetector::createPlatformDetector() { #ifdef Q_OS_WIN return new ScreenLockDetectorWindows(this); #endif } 4. 更新 CMakeLists.txt ``` ### 类图更新后: ``` ScreenLockDetectorBase △ │ ┌────┴────┬──────────┬────────────┐ │ │ │ │ Linux macOS Windows Android ``` ## 职责分配 | 类 | 职责 | 平台 | |---|------|------| | `ScreenLockDetector` | 工厂类,创建平台实例,转发信号 | 所有 | | `ScreenLockDetectorBase` | 定义接口,管理公共状态 | 所有 | | `ScreenLockDetectorLinux` | DBus 信号监听和处理 | Linux | | `ScreenLockDetectorMacOS` | NSDistributedNotificationCenter 监听 | macOS | ## 优势总结 1. **单一职责**: 每个类只负责一个平台 2. **开闭原则**: 对扩展开放,对修改关闭 3. **里氏替换**: 子类可以替换基类使用 4. **依赖倒置**: 依赖抽象而非具体实现 5. **接口隔离**: 客户端只依赖需要的接口 ## 参考 - Design Patterns: Elements of Reusable Object-Oriented Software (GoF) - Qt Documentation: https://doc.qt.io/ - SOLID Principles