繁体   English   中英

基于UML图的观察者模式实现

[英]Implementation of Observer Pattern Based on UML diagram

问题

我无法从“可重用面向对象软件的元素”中理解以下观察者模式的 UML 图。 谁能解释我为什么我的 Java 实现是错误的,我必须改变什么才能正确实现它?

UML图

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 来处理主题的观察者。 这可能是SubjectConcreteSubject甚至是Subject本身之间的 class 但由于 Java 不支持多个 inheritance 我经常使用其他方法并制作Subject

最简单的实现是让ConcreteSubject维护观察者列表,但在现实世界的应用程序中,您不希望开发人员这样做或依赖他们正确实现它。

相反,您可以使用一个中央注册表来维护每个主题的观察者列表,并且主题用来通知其观察者。 许多依赖注入框架都以这样的方式运行,即每当“主题”发生变化时,它们都会通知其观察者该事件。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM