观察者模式需要观察者和被观察者对象。
被观察者要能添加观察对象,被观察者发生改变之后要能通知观察者做出相应的改变(也就是回调观察者对象的相关方法,同时将被观察者自己传递过去)。
观察者对象要有统一的回调方法,这样才能产生一系列可以由被观察者调用的观察者对象;另外观察者需要可以取消监听观察者对象的方法。(可以通过实现接口搞定)
代码示例如下:
观察者要实现的接口
package com.company.test;
//观察者应该实现的接口,里面包含观察对象的回调方法
public interface Observer {
/**
* 被观察者发生改变之后通过该方法回调观察者做出对应改变
* @param observed 被观察者对象
*/
public void update(Observed observed);
/**
* 注销被观察者里面注册的该对象
* @param observed 被观察者对象
*/
public void unReg(Observed observed);
}
观察者1
package com.company.test;
public class WebObserver implements Observer {
@Override
public void update(Observed observed) {
// TODO Auto-generated method stub
System.out.println("更新观察者名字为: " + observed.getName());
}
@Override
public void unReg(Observed observed) {
// TODO Auto-generated method stub
observed.getObservers().remove(this);
}
}
观察者2
package com.company.test;
public class MailObserver implements Observer {
@Override
public void unReg(Observed observed) {
// TODO Auto-generated method stub
//撤销注册
observed.getObservers().remove(observed);
}
@Override
public void update(Observed observed) {
// TODO Auto-generated method stub
//当被观察者name改变时,邮件通知相关人员
System.out.println("通过邮件通知相关人员观察者名字改变为:" + observed.getName());
}
}
被观察者
package com.company.test;
import java.util.HashSet;
public class Observed {
private String name;
private HashSet<Observer> observers;
//构造方法
public Observed(String name) {
this.name = name;
observers = new HashSet<Observer> ();
}
//添加观察者
public void addObserver(Observer observer) {
observers.add(observer);
}
//通知观察者执行update方法
public void notifyObserver() {
for(Observer ob:observers) {
ob.update(this);
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
//名字被改变的时候通知观察者
this.notifyObserver();
}
public HashSet<Observer> getObservers() {
return observers;
}
public void setObservers(HashSet<Observer> observers) {
this.observers = observers;
}
}
调用测试类
package com.company.test;
public class ObserverPattern {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Observed observed = new Observed("xiaoming");
Observer ob1 = new WebObserver();
Observer ob2 = new MailObserver();
observed.addObserver(ob1);
observed.addObserver(ob2);
System.out.println("第一次改变被观察者名字");
observed.setName("ligang");
//观察者1取消观察
ob1.unReg(observed);
System.out.println("第二次改变被观察者名字");
observed.setName("xiaoxiao");
}
}