我可以用什么代替"这个"作为传递论点?

时间:2016-02-11 16:38:56

标签: java design-patterns observer-pattern

我实际上是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);
}
}

2 个答案:

答案 0 :(得分:0)

您的方法注册和取消订阅接收博客作为参数似乎很奇怪。您需要在Observer的构造函数中实例化您的博客,或者在Observer中使用setter方法来获取您的博客。或者至少如果你想通过方法寄存器传递它,那么保留它。取消订阅的方法应该使用用于在那里注册的博客的相同实例。如果将空值传递给寄存器或取消订阅方法,则可能会发生NPE。否则你的代码看起来不错

答案 1 :(得分:0)

您的问题可能是以下两种情况之一:

1)您的观察者变量未初始化,因此请调用:

observers.add(O)

抛出异常。你需要初始化你的观察者"变量,例如:

observers = new ArrayList()

2)你的变量"博客"在你的" blog.registerObserver(this)" call为null,在这种情况下,您应该初始化您的博客变量。