来自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
必须向用户显示一条消息。因此FileWriter
由FileHandler
使用,但不知道谁在调用write
方法。FileHandler
是FileWriter.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.
}
完全不同类型(SettingsHandler
和ContactsHandler
(的多个对象,但共同的基础/接口类型已订阅事件源的同一事件。一切都干净。使用事件源对象的对象实际订阅/lisgers。可以观察到的班级只需通知所有听众即可。没有其他互动。
将其结合起来:您的解决方案1 一点都不方便(尽管您可以使其起作用(并产生丑陋的代码。
解决方案2 实际上遵循描述如何实现事件的模式。该实现已被证明并已建立了很好的建立,因为它实现了引入事件并生成干净可读的代码的目标。
我怀疑它们俩都是。他们都必须实现观察者接口。
两者都是观察者模式的有效实现,但是除非您明确需要公开观察者列表,否则第二种方法是优选的。