我是设计模式的新手。
我正在尝试使用 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
方法。
答案 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)
我可以想到两个解决方案:
Segment
作为Point
类的更改的监听器。java.util.Observer
和java.util.Observable
。Segment
的AOP(面向方面)通知来调用Point.translater
方法。选项1(简单的实施版本):
Listener
界面。简单的通知方法很好;这个简单的实现不需要参数。Segment
以实施Listener
界面。Point
以存储List
个Listener
个参考文件。addListener
方法添加到Point
。removeListener
方法添加到Point
(可选)。Segment
构造函数中,将段注册为每个Point
个对象的侦听器。List
课程中存储Point
个Segment
个引用。在构造函数中设置它们。也许必须在Segment
类中存储ex1和ex2。Point.translater
方法,为每个注册的侦听器调用Listener.notify
方法。notify
中实施Segment
方法,以便在调用时重新计算longueur
值。选项2:执行与上述相同的操作,但使用java.util.Observer
界面而不是您自己的Listener
界面,并Point
实施java.util.Observable
。
选项3:AOP看起来有点矫枉过正。我将此解决方案留给学生解决。