采用原生实现:
java.util.Observable
java.util.Observer
举例:多个人与猪价格的关系:
首先明确人应当是观察者对象,猪是被观察对象:
所以pig类继承Observable,并设置只会在猪肉价格上涨的时候进行提醒
class Pig extends Observable{
private double price;
public Pig(double price) {
this.price = price;
}
public void setPrice(double price) {
if (this.price<price){
//说明涨价了
System.out.println("猪肉价格上涨");
this.price = price;
super.setChanged();
super.notifyObservers(price);
}else if (this.price==price){
System.out.println("猪肉价格持平");
}else {
System.out.println("猪肉价格下跌");
}
}
}
然后是观察对象 Man,实现Observer接口,该接口中只有一个方法:
class Man implements Observer {
private String mName;
public Man(String mName) {
this.mName = mName;
}
@Override
public void update(Observable o, Object arg) {
if (o instanceof Pig){
double price= (double) arg;
System.out.println(mName+"接收到当前的猪肉价格"+price);
}
}
}
观察者和被观察者都写好了,在主类中进行绑定,然后设置价格就可以看到打印了:
Pig pig=new Pig(50);
Man man1=new Man("aa");
Man man2=new Man("bb");
Man man3=new Man("cc");
Man man4=new Man("dd");
pig.addObserver(man1);
pig.addObserver(man2);
pig.addObserver(man3);
pig.addObserver(man4);
pig.setPrice(20);
pig.setPrice(50);
pig.setPrice(60);
pig.setPrice(60);
打印结果:
猪肉价格下跌
猪肉价格持平
猪肉价格上涨
dd接收到当前的猪肉价格60.0
cc接收到当前的猪肉价格60.0
bb接收到当前的猪肉价格60.0
aa接收到当前的猪肉价格60.0
猪肉价格持平
至此,一个最简单的观察者模式代码就完成了。