我班同学订阅了一些杂志,有杂质A,杂质B,订阅的同学有Ghost,Guang
现在每当杂质更新的时候就要向订阅了该杂志的同学发出通知以提醒他们。实现该逻辑的代码。
首先定义接口,我们需要一个Magzine
接口和Observer
接口。
用来赋予杂质和观察者应有的行为。
interface Observer{
public void update();
}
abstract class Magzine{
protected String name;
protected String status;
protected List<Observer> observers = new ArrayList<Observer>();
abstract public void add(Observer observer);
abstract public void rm(Observer observer);
abstract public void notifyy();
}
对于杂志类来说,一定需要记录都有哪些人订阅了,因此需要有add方法和rm方法用来操作订阅者(观察者)。还需要有notifyy方法来通知这些订阅者更新信息。
同时,订阅者Observer
也需要获得提醒,于是拥有update
方法用来接收通知,当Magzine
类有更新的时候就会调用Observer的update方法通知他。
因此,Observer的具体对象如下:
class Ghost implements Observer{
private Magzine magzine = null;
public Ghost(Magzine magzine){
this.magzine = magzine;
}
@Override
public void update() {
System.out.println("Ghost:the magzine"+magzine.name +" has been updated");
}
}
class Guang implements Observer{
private Magzine magzine = null;
public Guang(Magzine magzine){
this.magzine = magzine;
}
@Override
public void update(){
System.out.println("Guang:the magzine"+magzine.name+" has been updated");
}
}
杂志Magzine的具体类如下:
class MagA extends Magzine{
@Override
public void add(Observer observer) {
observers.add(observer);
}
@Override
public void rm(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyy() {
for(Observer ob:observers){
ob.update();
}
}
}
class MagB extends Magzine{
@Override
public void add(Observer observer) {
observers.add(observer);
}
@Override
public void rm(Observer observer) {
observers.remove(observer);
}
@Override
public void notifyy() {
for(Observer ob:observers){
ob.update();
}
}
}
在客户端调用的时候即可这样进行订阅:
public static void main(String[] args){
//------------------初始化杂志和观察者--------------------
Magzine duzheMagzine = new MagA();
Magzine gaoxiaoMagzine = new MagB();
Observer aObserver = new Ghost(duzheMagzine);
Observer bObserver = new Guang(gaoxiaoMagzine);
duzheMagzine.name = "duzhe";
gaoxiaoMagzine.name = "gaoxiao";
//------------------观察者进行订阅-----------------------
duzheMagzine.add(aObserver);
gaoxiaoMagzine.add(bObserver);
//------------------杂志有更新---------------------------
duzheMagzine.status = "version1";
gaoxiaoMagzine.status= "version2";
//------------------主动通知读者--------------------------
duzheMagzine.notifyy();
gaoxiaoMagzine.notifyy();
}
执行结果为:
Ghost:the magzineduzhe has been updated
Guang:the magzinegaoxiao has been updated
观察者模式是通过被观察者保持拥有观察者的引用,从而可操纵观察者的”更新“方法;而观察者保留其订阅的”被观察者“的引用,从而可获得被观察者的状态信息。
将一个系统分割成一系列互相协作的类有个很不好的副作用,即需要维护相关对象间的一致性。我们不希望为了维持一致性而使得各类紧密耦合。
但是该模式的一大好处就是,被观察者不需要知道到底有多少Observer在关注着他或者这些Observer都是哪些具体的类,只要他状态变化了,依次发出通知即可;而Observer也不用知道到底是哪个具体的”被观察者“给他发了消息,而是只用在意它本身所接受到的更新信息即可。
当一个对象的改变需要通知其他对象或者同时改变其他对象的时候,而且它并不知道有多少具体对象有待改变时,应使用观察者模式。之所以将观察者和被观察者都定义为接口就是在接触耦合,使得双方都依赖于抽象而不是具体,这样双方各自的变化都不会影响到另一边。
原文地址:http://blog.csdn.net/langduhualangdu/article/details/44115395