观察者模式

介绍

* 观察者模式定义了对象的一对多模式, 让多个观察者对象同时监听一个主体对象;
* 当主体对象发送通知时, 所有观察者都收到推送;
* 也叫发布订阅模式;
* 属于行为型设计模式;

* spring中应用:
	* ContextLoaderListener 实现了 ServletContextListener 接口,
ServletContextListener 接口又继承了 EventListener

* 优点:
	* 一对多抽象耦合;
	* 支持广播通信;
* 缺点:
	* 过多的数据传播细节, 消耗时间;
	* 不保证数据处理的可靠性;
	* 写代码时, 注意循环广播;

代码(JDK提供的观察者模式)

介绍
* 学校给学生发布通知;
* 学生是订阅者, 学校是发布者;
  • 学校
public class School extends Observable{
	
	String SCname;
	public School(String SCname) {
		// TODO Auto-generated constructor stub
		this.SCname = SCname;
	}

	
	public void SCpublish(String msg){
		System.out.println(SCname + " 发布通知: " + msg);
		setChanged(); //父类方法, 标记变化;
		notifyObservers(); //父类方法, 发送通知
	}
}
  • 学生
public class Student implements Observer{

	String STname;
	public Student(String STname) {
		// TODO Auto-generated constructor stub
		this.STname = STname;
	}
	@Override
	public void update(Observable o, Object arg) {  //收到发布信息时,触发;
		// TODO Auto-generated method stub
		School sc = (School) o;
		String msg = (String) arg;
		System.out.println(STname + " 收到 "+ sc.SCname +" 通知,内容是 " + msg);
	}
	
	
}
  • test
public class Test {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		School sc = new School("北大青鸟");
		Student s1 = new Student("韩梅");
		Student s2 = new Student("李雷");

		//添加订阅者
		sc.addObserver(s1);
		sc.addObserver(s2);
		
		sc.SCpublish("Hello world!");
	}
}

代码 (基于Guava API 轻松落地观察者模式)

介绍
pom:
		<!-- 观察者模式, guava -->
		<dependency>
			<groupId>com.google.guava</groupId>
			<artifactId>guava</artifactId>
			<version>20.0</version>
		</dependency>
CODE
  • 观察者
public class GuavaListener {

	@Subscribe
	public void guavaListener(String msg){
		System.out.println("收到guava通知: " + msg);
	}
}
  • 发布者
public class Test {

	public static void main(String[] args) {
		EventBus eb = new EventBus();
		GuavaListener gl = new GuavaListener();
		eb.register(gl); //注册观察者;
		eb.post("Hello world!"); //发布者发布消息;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值