观察者模式,核心抽象对象管理所有依赖他的其他类,
并在设计中使其在发生变动时,主动通知并更新其他类;
也叫模型-视图模式、源-收听者模式、从属者模式。
该模式必须包含两个角色:观察者和被观察对象。
业务数据是被观察对象,用户界面是观察者
。观察者和被观察者之间存在“观察”的逻辑关联,
当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。
python实现
from abc import ABCMeta, abstractmethod
class Observer(metaclass=ABCMeta):
@abstractmethod
def update(self, notice):
pass
class Notice:
def __init__(self):
self.observers = []
def attach(self, obs):
self.observers.append(obs)
def detach(self, obs):
self.observers.remove(obs)
def notify(self):
for obs in self.observers:
obs.update(self)
class StaffNotice(Notice):
def __init__(self, company_info):
super().__init__()
self.__company_info = company_info
@property
def company_info(self):
return self.__company_info
@company_info.setter
def company_info(self, info):
self.__company_info = info
self.notify()
class Staff(Observer):
def __init__(self):
self.company_info = None
def update(self, notice):
self.company_info = notice.company_info
notice_obj = StaffNotice("init company")
s1 = Staff()
s2 = Staff()
notice_obj.attach(s1)
notice_obj.attach(s2)
notice_obj.company_info = "发点奖金"
print(s1.company_info)
print(s2.company_info)
notice_obj.detach(s1)
notice_obj.detach(s2)
notice_obj.company_info = "放假了 "
print(s1.company_info)
print(s2.company_info)
dart 实现
main(List<String> args) {
Subject subject = Subject();
HexaObserver(subject);
OctalObserver(subject);
BinaryObserver(subject);
print("First state change: 15");
subject.setState(15);
print("\nSecond state change: 10");
subject.setState(12483487);
}
//////////////////////////////////////////////////////////////////
///
/// 创建 Subject 类
///
class Subject {
List<Observer> _observers = <Observer>[];
late int _state;
int getState() {
return _state;
}
void setState(int state) {
this._state = state;
notifyAllObservers();
}
void attach(Observer observer) {
_observers.add(observer);
}
void notifyAllObservers() {
for (Observer observer in _observers) {
observer.update();
}
}
}
///
/// 创建 Observer 类
///
abstract class Observer {
late Subject _subject;
void update();
}
///
/// 创建实体观察者类
///
class BinaryObserver extends Observer {
BinaryObserver(Subject subject) {
this._subject = subject;
this._subject.attach(this);
}
@override
void update() {
print("Binary String: ${_subject.getState().toRadixString(2)}");
}
}
class OctalObserver extends Observer {
OctalObserver(Subject subject) {
this._subject = subject;
this._subject.attach(this);
}
@override
void update() {
print("Octal String: ${_subject.getState()}");
}
}
class HexaObserver extends Observer {
HexaObserver(Subject subject) {
this._subject = subject;
this._subject.attach(this);
}
@override
void update() {
print("Hex String: ${_subject.getState().toRadixString(16)}");
}
}
结果 [Running] dart "e:\source\dart\designpatterns\observer.dart" First state change: 15 Hex String: f Octal String: 15 Binary String: 1111
Second state change: 10 Hex String: be7b9f Octal String: 12483487 Binary String: 101111100111101110011111