Java观察者模式或出版商 - subscriber模式的变化



来自2个变化的实际观察者模式是什么?

  1. 在第一个,观察者负责订阅。
  2. 但是在第二种情况下,出版商采用有责任将特定的观察者添加到订户列表中。

因为,网络中有一些实现,这两者都将它们都是Java中的观察者模式。

    1。
    // Observer is taking the responsibility of subscribing 
    // Observer.java
    @Override
    public void subscribe(MessagePublisher publisher) {
        publisher.getObservers().add(this);
    }

2。

    // Publisher is taking the observer to subscribe
    // Publisher.java
     @Override
     public void addObserver(Observer observer) {
       observers.add(observer);
     }

第二个示例是实现所谓的观察者模式。(观察者(想在观察到的对象X(可观察到的事件源(中收到有关某些事件的通知,对吗?然后,您将 tell 可观察到的通知您。或换句话说,您开始聆听观察者的通知 - 这就是为什么观察者也称为侦听器。
可观察到的并不知道它的订户。它仅通过他们的IObserver接口来了解听众,该接口定义了实际的通知回调。可观察到的只是将观察者添加到容器或集合中。

第一个示例没有意义。可观察到的观察者呼唤一种方法使他订阅?该设计流必须很奇怪。

假设您有一个FileWriter类,该类别暴露了事件FileWriter.Completed。您还有另一个管理所有文件的FileHandler类。FileHandler调用FileWriter.write(filePath, data)

每次写操作后,FileHandler必须向用户显示一条消息。因此FileWriterFileHandler使用,但不知道谁在调用write方法。FileHandlerFileWriter.write(string, string)的众多消费者之一,知道FileWriter implements an observable interface called IWRITETETOFILECOLLETETEDEDEDEVENT and defines the method FILEWRITER.SUBSCRIBSCRIBETOWRITETETOWRITETETETETOFILECOLTETED(IOBSERVER EVENTLISTENER(`。

这就是"现实生活"中的真实实现的样子

// The interface for the publisher or observable of a special event
interface IWriteToFileCompletedEvent {
  void subscribeToWriteToFileCompleted(IWriteToFileCompletedListener observer);
  void unsubscribeToWriteToFileCompleted(IWriteToFileCompletedListener observer);
}
// The interface for the observer of a special event
interface IWriteToFileCompletedListener {
  void notify(string filePathOfCompletedFile);
}
// The observable that exposes a special event
class FileWriter implements IWriteToFileCompletedEvent {
  private List<IWriteToFileCompletedListener> writeToFileCompletedListeners = new ArrayList<>();
  public void subscribeToWriteToFileCompleted(IWriteToFileCompletedListener observer) {
    this.writeToFileCompletedListeners.add(observer);
  }
  public void unsubscribeToWriteToFileCompleted(IWriteToFileCompletedListener observer) {
    this.writeToFileCompletedListeners.remove(observer);
  }
  public void writeToFile(string filePath, string data) {
    // Write data to file
    // Once done notify all listeners of the write completed event
    for (IWriteToFileCompletedListener observer : this.writeToFileCompletedListeners) {
      observer.notify(filePath);
    }
  } 
}
// The observer of a special event
class ContactsHandler implements IWriteToFileCompletedListener {
  private FileWriter fileWriter = new FileWriter();
  public void saveUserContactToFile(string filePath, string userInput) {
    this.fileWriter.subscribeToWriteToFileCompleted(this);
    this.fileWriter.writeToFile(filePath, userInput);
  }
  // Implementation of interface IWriteToFileCompletedListener 
  public void notify(string filePath) {
    this.fileWriter.unsubscribeToWriteToFileCompleted(this);
    this.messageDialog.show("The new contact was successfully saved to " + filePath);
  }
}
// Another observer of a special event
class SettingsHandler implements IWriteToFileCompletedListener {
  private FileWriter fileWriter = new FileWriter();
  public void saveUserSettingsToFile(string filePath, string userSettings) {
    this.fileWriter.subscribeToWriteToFileCompleted(this);
    this.fileWriter.writeToFile(filePath, userSettings);
  }
  // Implementation of interface IWriteToFileCompletedListener 
  public void notify(string filePath) {
    this.fileWriter.unsubscribeToWriteToFileCompleted(this);
    this.messageDialog.show("The new settings were successfully saved to " + filePath);
  }
}

类将像

相互作用
public void main(strng[] args {
  SettingsHandler settingsHandler = new SettingsHandler();
  ContactsHandler contactsHandler = new ContactsHandler();
  // Imaging this method receives user input fromo the UI:
  string newContact = textBox.gettext();
  this.contactsHandler.saveUserContactToFile("C:Contacts.txt", newContact);
  // While waiting for the message to show the user adjusted some settings and clicked 'save'
  string changedSettings = getChangedSettings();
  this.settingsHandler.saveUserSettingsToFile("C:UserSettings.txt", changedSettings);
  // After a while the user sees the messages send from the event listeners.
}

完全不同类型(SettingsHandlerContactsHandler(的多个对象,但共同的基础/接口类型已订阅事件源的同一事件。一切都干净。使用事件源对象的对象实际订阅/lisgers。可以观察到的班级只需通知所有听众即可。没有其他互动。

将其结合起来:您的解决方案1 一点都不方便(尽管您可以使其起作用(并产生丑陋的代码。

解决方案2 实际上遵循描述如何实现事件的模式。该实现已被证明并已建立了很好的建立,因为它实现了引入事件并生成干净可读的代码的目标。

我怀疑它们俩都是。他们都必须实现观察者接口。

两者都是观察者模式的有效实现,但是除非您明确需要公开观察者列表,否则第二种方法是优选的。

最新更新