ScreenLockDetector/docs/CLASS_DIAGRAM.md

270 lines
14 KiB
Markdown
Raw Normal View History

# 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