使用2个Oberservers观察Object的属性

时间:2017-04-14 11:44:00

标签: java observable

我得到了一个具有两个属性的产品对象,我想用两个不同的oberservers来观察。但是,如果我只改变一个属性,我也会从另一个属性观察者那里收到一条通知,告知它已被更改。我怎样才能确保只在真正改变时收到通知?

import java.util.Observable;
public class Product extends Observable {

        private String name;
        private double price;


        public void setName(String n){
            name = n;
            this.setChanged ();
            this.notifyObservers();
        }

        public void setPrice(double p){
            price = p;
            this.setChanged ();
            this.notifyObservers();
        }

        public String getName() {
            return name; 
        }

        public double getPrice() {
            return price; 
        }
    }

public class ObserverDemo {
    public static void main(String [] args) throws Exception {

        Product p1 = new Product();
        p1.addObserver((obj, arg) -> System.out.println("Name was changed to: " + ((Product) obj).getName()+"\n"));
        p1.addObserver((ob, arg) -> System.out.println("Price was changed to: " + ((Product) ob).getPrice()+"\n"));


        p1.setPrice(1.95);
        p1.setName("Milk");


        p1.setName("Banana");
        p1.setPrice(0.95);
    }
}

2 个答案:

答案 0 :(得分:0)

可观察类的任何更改都将通知所有已注册的观察者类。您可以使用notifyObservers方法中的参数来标识更改并仅创建一个观察者对象。

import java.util.Observable;
public class Product extends Observable {

    private String name;
    private double price;


    public void setName(String n){
        name = n;
        this.setChanged ();
        this.notifyObservers("Name was changed to " + n + "\n");
    }

    public void setPrice(double p){
        price = p;
        this.setChanged ();
        this.notifyObservers("Price was changed to " + p + "\n");
    }

    public String getName() {
        return name; 
    }

    public double getPrice() {
        return price; 
    }
}

public class ObserverDemo {
    public static void main(String [] args) throws Exception {

        Product p1 = new Product();
        p1.addObserver((obj, arg) -> System.out.println(arg));

        p1.setPrice(1.95);
        p1.setName("Milk");

        p1.setName("Banana");
        p1.setPrice(0.95);
    }
}

答案 1 :(得分:0)

是的,这就是我首先想到的,但我应该与2名观察员一起做。我完全不知道如何解决这个问题。