如何通过2个参数更改通知观察者?

时间:2017-02-01 17:18:51

标签: java design-patterns

我是设计模式的新手。

我正在尝试使用 Java 解决有关 Observer 设计模式的练习: 我们有一个 Point 类和一个 Segment 类:

Point{
    void translater(int dx,int dy);
    double distance(Point p);
}

Segment{
    private double longueur;
    public Segment(Point ex1,Point ex2){....longueur=ex1.distance(ex2);}

    public double getLongueur(){}
}

如果我们对点数更改p.translater x y ,我希望通知 Segment 类。< / p>

如何使用 x y 值通知观察者

注意:我不得更改getLongueur方法。

2 个答案:

答案 0 :(得分:0)

您需要在Point类中保留一个观察者列表:在您的情况下,是一个Segments列表。

List<Segment> observers = new ArrayList<>();

比创建以下方法

void addObserver(Segment segment)
{
    observers.add(segment);
}

void notifyAll()
{
    for (Segment observer: observers)
        observer.notify()
}

translater方法中,添加

notifyAll();

在细分中添加notify方法

void notify()
{
    longueur=ex1.distance(ex2);
}

并在构造函数中添加以下行

ex1.addObserver(this);
ex2.addObserver(this);

答案 1 :(得分:0)

我可以想到两个解决方案:

  1. 注册Segment作为Point类的更改的监听器。
  2. 使用java.util.Observerjava.util.Observable
  3. 使用Segment的AOP(面向方面​​)通知来调用Point.translater方法。
  4. 选项1(简单的实施版本):

    • 创建Listener界面。简单的通知方法很好;这个简单的实现不需要参数。
    • 更改Segment以实施Listener界面。
    • 更改Point以存储ListListener个参考文件。
    • addListener方法添加到Point
    • removeListener方法添加到Point(可选)。
    • Segment构造函数中,将段注册为每个Point个对象的侦听器。
    • List课程中存储PointSegment个引用。在构造函数中设置它们。也许必须在Segment类中存储ex1和ex2。
    • 更改Point.translater方法,为每个注册的侦听器调用Listener.notify方法。
    • notify中实施Segment方法,以便在调用时重新计算longueur值。

    选项2:执行与上述相同的操作,但使用java.util.Observer界面而不是您自己的Listener界面,并Point实施java.util.Observable

    选项3:AOP看起来有点矫枉过正。我将此解决方案留给学生解决。