ScreenLockDetector/docs/CLASS_DIAGRAM.md

270 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ScreenLockDetector 类图
## UML 类图
```
┌─────────────────────────────────────────────────────────────┐
│ ScreenLockDetector │
│ (工厂类/门面类) │
├─────────────────────────────────────────────────────────────┤
│ - m_detector: ScreenLockDetectorBase* │
├─────────────────────────────────────────────────────────────┤
│ + ScreenLockDetector(parent: QObject*) │
│ + ~ScreenLockDetector() │
│ + initialize(): bool │
│ + isScreenLocked(): bool │
│ - createPlatformDetector(): ScreenLockDetectorBase* │
├─────────────────────────────────────────────────────────────┤
│ signals: │
│ + screenLocked() │
│ + screenUnlocked() │
│ + lockStateChanged(locked: bool) │
└─────────────────────────────────────────────────────────────┘
│ creates
┌─────────────────────────────────────────────────────────────┐
│ ScreenLockDetectorBase (抽象基类) │
│ <<abstract>> │
├─────────────────────────────────────────────────────────────┤
│ - m_isLocked: bool │
├─────────────────────────────────────────────────────────────┤
│ + ScreenLockDetectorBase(parent: QObject*) │
│ + ~ScreenLockDetectorBase() │
│ + isScreenLocked(): bool │
│ + initialize(): bool = 0 <<pure virtual>> │
│ # 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