Java中设计模式之观察者模式详解与实现

package com.xiawei.observer;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;

/**
* 这里我们来了解一下观察者模式,它也叫发布订阅模式。
* 那么我们带着三个问题去了解:1.什么是观察者模式?
* 2.观察者模式有什么用?3.如何设计观察者模式?
* 1.什么是观察者模式?
* 所谓观察者模式,就是对象间的一种一对多的依赖关系。
* 当一个对象发生改变时,所有依赖他的对象都会得到通知
* 并被自动更新。
* 2.观察者模式有什么用?
* 有利于程序后续的扩展,使代码功能的责任更加清晰,遵循
* 了编程的单一职责原则。
* 3.如何设计观察者模式?
* 至于如何设计观察者模式,我们一起来看我以下的代码实现:
* 咚咚咚!开始。。。
*
*/
//首先在写代码之前,我们要知道,观察者模式,就是体现在观察上面。那么观察谁呢?
//观察美女。当然不是,哈哈哈。不过说到观察美女,那么美女就是一个被观察者了。
//哈哈哈。其实这里我要引出的是,观察者和被观察者这两个对象。
//下面我们以网上商品供应者和网络商城为例,供应商推出了新产品,那么与他合作的
//网上商城必须倒要被通知到,但你又不能一个一个在后台向每个商城去做维护,这是不
//能的,所以我们必须想一个办法,使其达到,只要供应商商品有改变,所有与他合作
//的网络商城都会被统一通知到。这里就用NB的观察者模式来解决。
/**
* 被观察者</p>
* 产品列表</p>
*
*/
//作为被观察者,她需要继承Observable这个类
public class ProductLists extends Observable{

//定义一个产品列表
private List<String> productList = null;
//定义类的唯一实例(静态化ProductLists)
private static ProductLists instance = null;
//构建方法私有化
//写到这里我们来复习一下,什么是构建方法私有化?
//构建方法私有化,就是说这个类的构造方法被私有化了,外面不能使用了
//也就是外面不能去new这个类的对象了.外面在内部给他实例画一个对象
//然后在通过方法到内部来获取他,就可以了.
private ProductLists(){}

/**
* 通过单例模式,来获取当前类的唯一实例
* return 产品列表对象的唯一实例
*/
public static ProductLists getInstance(){
if(instance == null){
instance = new ProductLists();
instance.productList = new ArrayList<String>();
}
return instance;

}

/**
* 增加观察者(电商接口)
*/
public void addProductListsObserver(Observer observer){
this.addObserver(observer);
}
//其实上面这个方法也可以不要,可以直接调用Observable类中的addObserver()方法

/**
* 动作:增加新产品
* @param 新品
*/
public void addProduct(String newProduct){
//向产品列表中增加新产品
productList.add(newProduct);
//打印一下,看看
System.out.println("产品列表中增加了新产品:"+newProduct+"。");
//设置被观察者对象发生改变(也就是标记此observer对象为已经改变了的对象)
this.setChanged();//这个方法是重点
//来看一下被观察对象是否已被改变,用Observable类的hasChanged()方法,如果改变这个
//方法返回true,否则返回false
System.out.println("被观察者对象是否改变:"+this.hasChanged());
//通知观察者,并传递新增产品信息到观察者
this.notifyObservers(newProduct);
}
}

========================================================

package com.xiawei.observer;

import java.util.Observable;
import java.util.Observer;

//下面来创建一个观察者
/**
* 观察者--淘宝商城 </p>
* 这个类要去实现一下Observer这个接口.并实现其update()方法
*/
public class TaoBaoObserver implements Observer{

@Override
public void update(Observable o, Object product) {

String newProduct = (String) product;
//模拟一下观察者的变化
System.out.println("发送新产品["+newProduct+"]同步到淘宝商城上了!");
}


}

========================================================

package com.xiawei.observer;

import java.util.Observable;
import java.util.Observer;
//下面来创建第二个观察者
/**
* 观察者--京东商城 </p>
* 这个类要去实现一下Observer这个接口.并实现其update()方法
*/
public class JingDongObserver implements Observer {

@Override
public void update(Observable o, Object product) {

String newProduct = (String) product;
//模拟一下观察者的变化
System.out.println("发送新产品["+newProduct+"]同步到京东商城上了!");

}

}

=========================================================

package com.xiawei.observer;

public class TestObserver {

public static void main(String[] args) {

//获取被观察者对象
ProductLists observer = ProductLists.getInstance();
//获取观察者对象
JingDongObserver jingDongObserver = new JingDongObserver();
//获取第二个观察者对象
TaoBaoObserver taoBaoObserver = new TaoBaoObserver();
//被观察者注册观察者(这个很重要)
observer.addObserver(jingDongObserver);
observer.addObserver(taoBaoObserver);
//传入观察者的变化内容
observer.addProduct("新品X");

}

}

 代码运行结果:

  产品列表中增加了新产品:新品X。
  被观察者对象是否改变:true
  发送新产品[新品X]同步到淘宝商城上了!
  发送新产品[新品X]同步到京东商城上了!