设计模式16-观察者模式

观察者模式
也叫发布订阅模式,定义为:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则
所有依赖于它的对象都会得到通知并被自动更新。
优点:
1、观察者和被观察者之间是抽象耦合;
2、建立一套触发机制;
缺点:
要考虑开发效率和运行效率的问题,一个被观察者、多个观察者,消息的通知默认是顺序执行,一个观察者卡壳,
会影响整体的执行效率。在这种情况下,一般采用异步的方式。
使用场景:
1、关联行为场景。
2、事件多级触发场景。
3、跨系统的消息交换场景,如消息队列的处理机制。
注意事项:
1、广播链的问题:一个角色既是观察者又是被观察者,消息多级传递。
建议:在一个观察者模式中最多出现一个对象既是观察者又是被观察者,也就是说消息最多转发一次(传递两次)。
2、异步处理问题:观察者比较多,考虑异步。异步就要考虑线程安全和队列的问题。
项目中真实的观察者模式
1、观察者和被观察者之间的消息沟通
实际中,观察者中的update一般接收两个参数:一是被观察者,二是DTO(Data Transfer Object)数据传输对象,由观察者消费
2、观察者响应方式
在一个观察者多个被观察者的情况下,性能就要被考虑,观察者需要快速进行响应:
    1、采用多线程技术————异步架构;
    2、缓存技术,开发难度大,压力测试需要充分————同步架构。
3、被观察者尽量自己做主
考虑被观察者的状态改变是否一定要通知观察者。一般对被观察者的业务逻辑方法实现重载,增加一个
doSomething(boolean isNotify)方法决定是否进行通知,而不是通知后由观察者判断是否需要消费。
 

//被观察者:定义被观察者必须实现的职责,它必须能够动态的增加、取消观察者。
//它一般是抽象类或者实现类,仅仅完成作为被观察者必须实现的职责:管理观察者并通知观察者
public abstract class Subject {
	//定义一个观察者数组
	private Vector<Observer> vector = new Vector<>();
	//增加一个观察者
	public void addObserver(Observer o){
		this.vector.add(o);
	}
	//删除一个观察者
	public void removeObserver(Observer o){
		this.vector.remove(o);
	}
	//通知所有观察者
	public void notifyObservers(){
		for (Observer observer : vector) {
			observer.update();
		}
	}
}
//具体被观察者:定义被观察者自己的逻辑,同时定义对哪些事件进行通知
public class ConcreteSubject extends Subject {
	public void doSomething(){
		//定义自己的业务逻辑
		//通知观察者
		super.notifyObservers();
	}
}
//观察者:观察者接收到消息后,对收到的信息进行处理
public interface Observer {
	public void update();
}
//具体观察者
public class ConcreteObserver implements Observer {
	@Override
	public void update() {
		System.out.println("接收到信息,并进行处理");
	}
}
public class Client {
	public static void main(String[] args) {
		Observer concreteObserver = new ConcreteObserver();
		ConcreteSubject concreteSubject = new ConcreteSubject();
		concreteSubject.addObserver(concreteObserver);
		concreteSubject.doSomething();
	}
}

 

    原文作者:zhuozi0810
    原文地址: https://blog.csdn.net/zhuozi0810/article/details/89189367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞