设计模式之禅-观察者模式

观察者模式(Observer Pattern)也叫做发布订阅模式(Publish/subscribe),它是在一个项目中经常使用的模式,定义如下:
Define a one-to-mang dependency between objects so that when one object changes state,all its dependents are notified and updated automatically
(定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。)

观察者通用类图
Subject:被观察者

定义被观察者必须实现的职责,它必须能够动态添加、删除观察者。它一般 是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者(notifyObservers)

Observer观察者

观察者收到信息后,即进行update操作,对接收的信息进行处理
观察者是被被观察者管理的

ConcreteSubject具体的被观察者

定义被观察者自己的业务逻辑,同时定义对哪些时间进行通知。

ConcreteObserver具体的观察者

每个观察者在接收到消息后处理反应是不同,各个观察者有自己的处理逻辑。

被观察者抽象接口

public interface Observable {
	//添加一个观察者
    public void addObserver(Observer observer);
	//删除一个观察者
    public void deleteObserver(Observer observer);
	//通知所有观察者
    public void notifyObservers(String context);
}

具体实现类

public class Subject implements Observable{
	//定义一个观察者数组
	private Vector<Observer> obsverVector = new Vector<Observer>();
	//添加一个观察者
    public void addObserver(Observer observer){
    	obsver.add(observer);
    }
	//删除一个观察者
    public void deleteObserver(Observer observer){
		obsverVector.remove(obserber);
	}
	//通知所有观察者
    public void notifyObservers(String context){
		for(Observer o : obsverVector){
			o.update(context);
		}
	}
	
	//业务逻辑,dosomething时通知所有在数组中的观察者
	public void dosomething(){
	/**
	dosth
	*/
	notifyObservers("dosth");
	}
}

观察者接口

public interface Observer {
	//根据被观察者推送的信息,观察者进行更新信息
    public void update(String context);
}

具体的client中

说下思路
先建立subject实例
然后建立不同的观察者实例
subject里面添加不同的观察者实例(当然也可以删除)
在subject更新事件的时候(可以通知观察者)

优点

  1. 观察者和被观察者之间是抽象耦合(增加观察者还是被观察者都非常容易扩展)
  2. 建立一套触发机制(被观察者改变,触发导致观察者发生变化)

缺点

  1. 观察者模式需要考虑开发效率和运行效率,一个被观察者,多个观察者。开发和调试比较复杂,而且java中消息通知是顺序执行,一个观察者卡壳或者挂了,会影响整体的执行效率。在这种情况下,一般考虑采用异步的方式。

异步处理问题
异步处理就要考虑线程安全和队列的问题,还是看一看Message Queue,会有更深的了解。(作者表示:没看过,以后再看)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值