`

观察者模式

阅读更多

 

原创内容,转载请注明出处

观察者模式在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();
	}

 

测试结果如下

 

 

如上例可以看出,观察者模式中一般都会使用回调模式。

 

源代码如附件

 

  • 大小: 5.2 KB
  • 大小: 6.3 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics