观察者模式存在观察者和被观察者,观察者有多个,被观察者有一个。当被观察者状态改变时,观察者要做出对应得更新。该设计模式基于回调机制,被观察者要继承Observable类,观察者要实现Observer接口,并实现update()方法。
1:被观察者:ProductList
package observer;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;
public class ProductList extends Observable{
private List<String> productList=null;//产品列表
private static ProductList instance; //类唯一实例,单例模式
private ProductList() {}//构造方法私有化
public static ProductList getInstance() {
if(instance==null){
instance=new ProductList();
instance.productList=new ArrayList<String>();
}
return instance;
}
public void addProductListObserver(Observer observer) {
this.addObserver(observer);
}
public void addProduct(String newProduct) {
productList.add(newProduct);
System.out.println("产品列表新增加了产品:"+newProduct);
this.setChanged();//设置被观察对象发生变化
this.notifyObservers(newProduct); //通知观察者,并传递新产品
}
}
二:观察者:JingDongObserver,TaobaoObserver
package observer;
import java.util.Observable;
import java.util.Observer;
public class JingDongObserver implements Observer{
@Override
public void update(Observable o, Object product) {
// TODO Auto-generated method stub
String newProduct=(String)product;
System.out.println("发布了新产品:"+newProduct+"同步到京东商城");
}
}
package observer;
import java.util.Observable;
import java.util.Observer;
public class TaobaoObserver implements Observer{
@Override
public void update(Observable o, Object product) {
// TODO Auto-generated method stub
String newProduct=(String)product;
System.out.println("发布了新产品:"+newProduct+"同步到淘宝");
}
}
3:测试类:ObserverTest
package observer;
import java.util.Observable;
import com.sun.org.apache.xpath.internal.axes.OneStepIterator;
public class ObserverTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ProductList observable=ProductList.getInstance();
TaobaoObserver taoBao=new TaobaoObserver();
JingDongObserver jingDong=new JingDongObserver();
observable.addObserver(taoBao);
observable.addObserver(jingDong);
observable.addProduct("新增产品辣条");
}
}