观察者模式的应用场景:
在有些场景,比如多个类可能需要依赖一个类,比如价格,如果产品价格发生变化,那么依赖他的类也需要拍做出相应的变化或者更新。那么这些依赖产品的类就是观察者,产品就是被观察者抑或主题对象。
/**
* 这是一个观察者接口,如果要作为一个观察者对象
* 需要实现该接口,这个接口一般定义一些公共的且
* 需要操作主题对象的方法
* @author nickyzhang
*/
public interface Observer {
//Observable 代表了主体对象 ,因为你需要更新什么对象,我们需要知道
//什么东西变化我们才需要更新
public abstract void update(Observable obs, Object obj);
}
package com.aaxis.pattern.observer;
import java.util.ArrayList;
import java.util.List;
public abstract class Observable {
//保存绑定该主体对象的监听器
List<Observer> listenerList = new ArrayList<Observer>();
//注册观察者
public void registerObserver(Observer o){
listenerList.add(o);
}
//删除观察者
public void removeObserver(Observer o){
listenerList.remove(o);
}
//什么属性变化通知注册的所有观察者
public void notifyAllObserver(Object value){
//遍历每一个观察者,并且根据变化的值进行更新
for(Observer o : listenerList){
o.update(this, value);
}
}
}
/**主题对象==被观察者*/
public class Product extends Observable{
private String name;
private double price;
public Product() {
}
public Product(String name, double price) {
this.name = name;
this.price = price;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//当有程序调用Product的setName时自动通知观察者
notifyAllObserver(name);
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
notifyAllObserver(price);
}
}
//两个观察者
public class NameObserver implements Observer {
public void update(Observable obs, Object obj) {
if(obj instanceof String){
System.out.println("姓名观察者:"+obs+"名称以变为"+obj);
}
}
}
public class PriceObserver implements Observer{
public void update(Observable obs, Object obj) {
if(obj instanceof Double) {
System.out.println("价格观察者:"+obs +"价格改变为:"+obj);
}
}
}
public class ObserverTest {
public static void main(String[] args) {
Product product = new Product("Guiatr",4568.23);
NameObserver nameObserver = new NameObserver();
PriceObserver priceObserver = new PriceObserver();
product.registerObserver(nameObserver);
product.registerObserver(priceObserver);
product.setName("Bass");
product.setPrice(3456.12);
}
}