设计模式十观察者模式:边学边做个生成电子书的工具(python+dart)

127 阅读1分钟

观察者模式,核心抽象对象管理所有依赖他的其他类,

并在设计中使其在发生变动时,主动通知并更新其他类;

也叫模型-视图模式、源-收听者模式、从属者模式。

该模式必须包含两个角色:观察者和被观察对象。

业务数据是被观察对象,用户界面是观察者

。观察者和被观察者之间存在“观察”的逻辑关联,

当被观察者发生改变的时候,观察者就会观察到这样的变化,并且做出相应的响应。

image.png 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