[英]Implementation of Observer Pattern Based on UML diagram
问题
我无法从“可重用面向对象软件的元素”中理解以下观察者模式的 UML 图。 谁能解释我为什么我的 Java 实现是错误的,我必须改变什么才能正确实现它?
UML图
尝试(但错误)的实施
public interface Subject {
public static final List<Observer> observers = new ArrayList<Observer>();
public void attach(Observer o);
public void detach(Observer o);
public void notifyObservers();
}
public interface Observer {
public void update();
}
public class ConcreteSubject implements Subject {
private String subjectState;
@Override
public void attach(Observer o) {
observers.add(o);
}
@Override
public void detach(Observer o) {
observers.remove(o);
}
@Override
public void notifyObservers() {
for (Observer o : observers) {
o.update();
}
}
public String getState() {
return subjectState;
}
public void setState() {
subjectState += "x";
}
}
public class ConcreteObserver implements Observer {
private ConcreteSubject subject;
public String observerState;
@Override
public void update() {
observerState = subject.getState();
}
}
一个问题是您有一个 static Subject
中的观察者列表,因此所有主题共享相同的观察者。 但是,该模式要求每个单独的主题都有自己的观察者,因此将列表放入ConcreteSubject
并使其成为实例字段。
另一个问题是您的ConcreteObserver
有一个类型为ConcreteSubject
的字段。 但是,它应该不知道Subject
的具体实现,因此该字段应该只有Subject
类型。
编辑:实际上,UML 图需要具体观察者了解具体主题才能调用getState()
所以上面的段落在你的情况下是不正确的——这在这里应该不是问题。
然而,实际上我实际上会有另一个接口,它扩展了Subject
并从观察者隐藏了ConcreteSubject
的实现。
编辑 2 :
正如建议的那样,您还可以使用抽象 class 来处理主题的观察者。 这可能是Subject
和ConcreteSubject
甚至是Subject
本身之间的 class 但由于 Java 不支持多个 inheritance 我经常使用其他方法并制作Subject
。
最简单的实现是让ConcreteSubject
维护观察者列表,但在现实世界的应用程序中,您不希望开发人员这样做或依赖他们正确实现它。
相反,您可以使用一个中央注册表来维护每个主题的观察者列表,并且主题用来通知其观察者。 许多依赖注入框架都以这样的方式运行,即每当“主题”发生变化时,它们都会通知其观察者该事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.