1.定义
观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个消息发布对象。 这个发布者对象在状态发生变化时,会通知所有观察者对象或者指定的对象,使它们能够收到对应的消息并且对消息进行处理或者执行对应的操作。
2.UML类图

3.角色介绍
Subject:抽象被观察者,定义了观察者的集合,提供添加删除通知观察者的接口
Observer:抽象观察者,定义了消息更新的接口
4.代码实现
4.1抽象被观察者实现
public interface ISubject<M>{
void attach(IObserver iObserver);
void dettach(IObserver iObserver);
void notifyObserver(M message);
}
4.2抽象观察者实现
public interface IObserver<M>{
void update(M message);
}
4.3具体被观察者实现
public class Subject implements ISubject<Message>{
private List<IObserver> observerList=new ArrayList<>();
@override
public void attach(IObserver iObserver){
if(iObserver!=null&&!observerList.contains(iObserver)){
observerList.add(iObserver);
}
}
@override
public void dettach(IObserver iObserver){
observerList.remove(iObserver);
}
@override
public void notifyObserver(M message){
for(IObserver iObserver:observerList){
iObserver.update(message);
}
}
}
4.4观察者实现
public class Observer implements IObserver<Message>{
public void update(M message){
System.out.println(message);
}
}
4.5具体应用
public class Client {
public static void main(String[] args){
Observer observer=new Observer();
Subject subject=new Subject();
subject.attach(observer);
subject.notifyObserver("观察者模式测试");
}
}
5.应用场景
1.当一个对象的改变需要通知其它对象改变时。
2..跨系统的消息交换场景,如消息队列、事件总线的处理机制。
6.优点
1.依赖于抽象而不是具体,低耦合,需要监听时只需要实现对应的接口,并实现实现消息接收的方法
2.易于扩展,符合开放原则
7.缺点
1.观察者和被观察者没有完全的接触依赖,
2.有时观察者不必接收所有被观察者发送的消息,造成多余信息的传递
3.在循环对观察者通知时,可能观察的的阻塞或者消息执行不通,影响程序的执行效率
网友评论