如何将观察者添加到构造函数中?

时间:2020-07-15 23:17:37

标签: java object design-patterns observer-pattern

public static void main(String[] args) {
        WeatherData subject =new WeatherData();
        new ShowEstadistics(subject);
} 


public class WeatherData implements Subject {

    ArrayList<Observer> observers;

    public WeatherData() {
        observers = new ArrayList();
    }

    @Override
    public void registerObserver(Observer o) {
        observers.add(o);
    }
}



public class ShowEstadistics implements Observer{

WeatherData weatherdata;

public ShowEstadistics(WeatherData subject) {
     this.weatherdata=subject;

     this.weatherdata.registerObserver(this);
        
    }

我不知道观察者如何在此部分的主题中注册:

public ShowEstadistics(WeatherData subject) {
         this.weatherdata=subject;
    
         this.weatherdata.registerObserver(this);
            
        } 

因为我对天气数据应用了registerObserver方法,但是由于某种原因,它也在主题中注册。我不知道为什么。

请有人给我解释。

1 个答案:

答案 0 :(得分:-1)

假设您具有以下代码方案:

Integer x=new Integer(4);
Integer y=new Integer(5);
y=x;
x=new Integer(2);

在这种情况下,您认为y的值是什么?它是一个包含5的整数对象吗? 答案是包含2的整数对象

当我们说Integer x=new Integer(4)时,是指x指向内存中的一个地址,该地址的对象值为4。类似地,对于y,y指向内存中的一个地址,该地址为值为5的对象。 然后写y=x表示我们删除了指针,该指针指向对象包含5的地址,并将其指向x指向的对象,该对象当前是值5的对象。包含5的对象的地址没有指向它的任何变量不再,因此,您不能调用或修改其值。用x=new Integer(2)将x和y指向的地址对象更改为值为2的对象后,调用这些变量中的任何一个都将返回相同的对象(因为它们具有相同的引用)。

现在,这是一个基于Integer对象类型的基本示例,但是可以应用于任何更复杂的对象。