我实际上是Design Pattern概念的新手,我正在尝试实现Observer Pattern。
我有一个Blog类,可以通知观察者新的更改。它实现了Subject接口。它有一个registerObserver方法,用于添加新的观察者。另一方面,我有不同种类的观察者的类,它们都实现了Observer接口。
我想在观察者类中使用Register方法和Unsubscribe方法,以便他们可以选择何时添加和删除。但是,当我使用我在此处编写的代码时,运行时出现Null Pointer Exception错误,这显然是因为blog.registerObserver(this)行。
我有什么其他选择来实现Register和Unsubscribe方法?
public void registerObserver( Observer o) //when an observer resgiters we add
// it to the end of the list
{
observers.add(o);
}
Observer是一个接口,客户端类实现它。现在我有一类ClientForMusic:
public class ClientForMusic implements Observer, DisplayElement {
private String Music;
private Subject blog;
public ClientForMusic()
{}
public void Register (Subject Blog)
{
this.blog=blog;
blog.registerObserver(this);
}
public void Unsubscribe(Subject Blog)
{
this.blog=blog;
blog.removeObserver(this);
}
public void update(String music, String movie, String news, String science )
{
this.Music= music;
display();
}
public void display()
{
System.out.println("I have been notified of a new song:" + Music);
}
}
答案 0 :(得分:0)
您的方法注册和取消订阅接收博客作为参数似乎很奇怪。您需要在Observer的构造函数中实例化您的博客,或者在Observer中使用setter方法来获取您的博客。或者至少如果你想通过方法寄存器传递它,那么保留它。取消订阅的方法应该使用用于在那里注册的博客的相同实例。如果将空值传递给寄存器或取消订阅方法,则可能会发生NPE。否则你的代码看起来不错
答案 1 :(得分:0)
您的问题可能是以下两种情况之一:
1)您的观察者变量未初始化,因此请调用:
observers.add(O)
抛出异常。你需要初始化你的观察者"变量,例如:
observers = new ArrayList()
2)你的变量"博客"在你的" blog.registerObserver(this)" call为null,在这种情况下,您应该初始化您的博客变量。