观察者模式

 

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

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

 

测试结果如下

 

 

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

 

源代码如附件

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值