原创内容,转载请注明出处
观察者模式在Java中经常会使用到,最典型的就是swing和awt的事件机制,Spring中的事件机制亦如此,还有发布——订阅模型也是观察着模式,当发布者发生改变时,订阅者可以接收到发布者改变的信息。
好处:当需要添加新的订阅者时,不需要修改发布者内容,只需要创建新的订阅者(新的订阅者只需实现订阅接口即可),并且将订阅者注册到发布者对象中,则当发布者有发生变化时,新的订阅者可以接收到改变的通知。
UML类图如下
创建主题角色接口Subject,代码如下
package com.test.designermodel.observermodel;
public interface Subject {
void execute();
void addListener(Listener l);
void removeListener(Listener l);
void removeAllListener();
}
创建主题实现类ConcreteSubject,代码如下
package com.test.designermodel.observermodel;
import java.util.ArrayList;
import java.util.List;
public class ConcreteSubject implements Subject {
private List<Listener> listeners = new ArrayList<Listener>();
private int count;
public void addListener(Listener l) {
listeners.add(l);
}
public void execute() {
count++;
System.out.println("----------业务处理完成-------");
notifyListeners();
}
public void removeAllListener() {
if(listeners!=null){
listeners.clear();
}
}
public void removeListener(Listener l) {
if(listeners!=null){
listeners.remove(l);
}
}
private void notifyListeners(){
for (Listener l : listeners) {
System.out.println("-----监听器开始处理------");
l.update(count);
}
}
}
创建观察者接口,即事件机制中的监听器Lisener,代码如下
package com.test.designermodel.observermodel;
public interface Listener {
void update(int count);
}
编写Junit测试代码
/**
* 观察者模式
*/
@Test
public void testObserverModel(){
Subject subject = new ConcreteSubject();
subject.addListener(new Listener() {
public void update(int count) {
System.out.println("主题角色计数为"+count+",监听器处理");
}
});
subject.execute();
subject.execute();
}
测试结果如下
如上例可以看出,观察者模式中一般都会使用回调模式。
源代码如附件