1# 观察者模式
2## 概述
3### 简介
4定义了对象间的一种一对多依赖关系,使得每当一个对象状态发生改变时,其相关依赖对象皆得到通知并被自动更新。
5
6## 涉及功能
7### class Observable
8#### 接口说明
9
10|返回类型            | 名称           |
11| -------------- | -------------- |
12| virtual | **~Observable**() =default |
13| void | **AddObserver**(const std::shared_ptr< Observer >& o)<br>把指定的观察者添加到观察者的集合中。  |
14| int | **GetObserversCount**()<br>获取观察者的数量。  |
15| void | **NotifyObservers**()<br>通知所有观察者,无相关数据传输。  |
16| void | **NotifyObservers**(const ObserverArg* arg)<br>通知所有观察者,向观察者传入数据`arg`。  |
17| void | **RemoveAllObservers**()<br>移除所有观察者。  |
18| void | **RemoveObserver**(const std::shared_ptr< Observer >& o)<br>移除指定的观察者。  |
19
20### class Observer
21#### 接口说明
22|返回类型            | 名称           |
23| -------------- | -------------- |
24| virtual | **~Observer**() =default |
25| virtual void | **Update**(const Observable* o, const ObserverArg* arg) =0<br>观察者更新自己的函数接口。  |
26
27## 使用示例
28
291. 示例代码(伪代码)
30
31```c++
32#include <iostream>
33#include "../include/observer.h"
34
35using namespace OHOS;
36using namespace std;
37
38// 被观察者类,一个图书列表
39class BookList : public Observable {
40public:
41    BookList() { books_.clear(); }
42    void AddBook(const string& book)
43    {
44        books_.insert(book);
45        SetChanged();
46        NotifyObservers();
47    }
48
49    void RemoveBook(const string& book)
50    {
51        books_.erase(book);
52        SetChanged();
53        NotifyObservers();
54    }
55
56    const set<string>& GetBooks() { return books_; }
57private:
58    set<string> books_;
59};
60
61// 观察者类,对图书感兴趣的人
62class BookObserver : public Observer {
63public:
64    BookObserver() = default;
65    explicit BookObserver(const string &name) : name_(name)
66    {
67    }
68    void Update(const Observable* o, const ObserverArg* /* arg */) override
69    {
70        BookList* bookList = reinterpret_cast<BookList*>(const_cast<Observable*>(o));
71        books_ = bookList->GetBooks();
72        cout << name_ << " has been Notified" << endl;
73    }
74
75    int GetBooksCount() { return static_cast<int>(books_.size()); }
76    bool BookExists(const string& book) { return books_.count(book) > 0;}
77private:
78    set<string> books_;
79    string name_;
80};
81
82int main()
83{
84    BookList bookList;
85    // 构造观察者
86    shared_ptr<BookObserver> bookObserver1 = make_shared<BookObserver>("Mao");
87    shared_ptr<BookObserver> bookObserver2 = make_shared<BookObserver>("Administrator");
88    shared_ptr<BookObserver> bookObserver3 = make_shared<BookObserver>("You");
89    // 添加观察者
90    bookList.AddObserver(bookObserver1);
91    bookList.AddObserver(bookObserver2);
92    bookList.AddObserver(bookObserver3);
93    // 向图书列表中添加书籍,此时会通知观察者
94    bookList.AddBook("book1");
95    // 移除所有观察者
96    bookList.RemoveAllObservers();
97    // 此时从图书列表中移除书籍,此时没有观察者被通知
98    bookList.RemoveBook("book1");
99}
100```
101
1022. 测试用例编译运行方法
103
104- 测试用例代码参见base/test/unittest/common/utils_observer_test.cpp
105
106- 使用开发者自测试框架,使用方法参见:[开发自测试执行框架-测试用例执行](https://gitee.com/openharmony/testfwk_developer_test#%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E6%89%A7%E8%A1%8C)
107
108- 使用以下具体命令以运行`observer.h`对应测试用例
109
110```bash
111run -t UT -tp utils -ts UtilsObserverTest
112```