【发布时间】:2020-12-26 15:42:40
【问题描述】:
我在 MVC 应用程序中实现了观察者模式,因此 bean 可以监听模型中的变化。由于我使用的是 Java8,因此我使用的是 Java.util 中的 Observer 和 Observable。这是我编码的部分内容:
import java.util.Observable;
import java.util.Observer;
public class UserBean implements Observer{
private Integer userId;
private String userName;
private String userEmail;
/* getters and setters */
@Override
public void update(Observable o, Object object) {
if(object instanceof Integer)
setUserId((Integer)object);
else if(object instanceof String)
setUserName((String)object);
}
}
public class UserModel extends Observable {
private Integer id;
private String name;
private String email;
/* getters */
public void setId(Integer id){
this.id = id;
setChanged();
notifyObservers(id);
}
public void setName(String name){
this.name = name;
setChanged();
notifyObservers(name);
}
public void setEmail(String email){
this.name = email;
// how can i listen for this change?
/*setChanged();
notifyObservers(email);*/
}
}
我认为实现是正确的,因为在我进行的一个简单测试中,bean 类正确读取了对 Ids 和 Names 的更改,但我意识到我无法监听电子邮件属性的更改,因为在我正在使用 'instanceof' 来了解我必须更新哪个值的 bean 类。
有办法识别哪个变量发生了变化?我应该实现自己版本的 Observer 和 Observable 类,而不是使用 Java.Util? 我认为使用第二种解决方案我可以为每个属性定义一个更新方法,但我不知道如何在 Java 中管理同步过程。
【问题讨论】:
-
你也可以使用 DTO 通知观察者,它会带来一些关于属性的额外信息
-
不要使用 j.u.Observer 和 Observable。它们已经非常过时了。一个合适的接口定义应该使用泛型;它们是在泛型存在之前编写的。
-
遵循@Michael 的建议:stackoverflow.com/questions/46380073/…
-
@fantaghirocco 哦,很好。我几乎在我上次的评论中说他们应该继续并弃用它。很高兴他们有。那个从我身边经过:)
-
@fantaghirocco 你能解释得更好吗?我的教授没有向我们解释所有现有的模式,我也不知道 DTO(我只是用谷歌搜索)。
标签: java observer-pattern