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```