观察者模式

xiaoxiao2021-02-28  40

1.使用场景: Android开发中的广播机制,Servlet中监听器的实现。 2.UML表示 观察者模式包含如下的一些角色: 2.1 Subject:抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。 2.2 ConcreteSubject:具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。 2.3 Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。 2.4 ConcrereObserver:具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

具体的UML示意图如下:

3.代码实现

首先,定义Observer接口:

 

public interface Observer { /** * * @author lsj * @date 2018/2/15 11:41 * @param [subject] * @return void */ void update(Subject subject); } public class ConcreteObserverA implements Observer { private int state; @Override public void update(Subject subject) { state=((ConcreteSubject)subject).getState(); } public int getState() { return state; } public void setState(int state) { this.state = state; } } public class Subject { private List<Observer> list=new ArrayList<>(); public void register(Observer observer){ list.add(observer); } public void removeObserver(Observer observer){ list.remove(observer); } public void notifyAlls(){ for (Observer observer:list){ observer.update(this); } } } public class ConcreteSubject extends Subject{ private int state; public int getState() { return state; } public void setState(int state) { this.state = state; this.notifyAlls();//更新所有的订阅者 } }

定义普通测试类:

 

 

public class Client { public static void main(String[] args) { //目标对象 ConcreteSubject subject=new ConcreteSubject(); //创建多个观察者 ConcreteObserverA coa=new ConcreteObserverA(); ConcreteObserverA coa2=new ConcreteObserverA(); ConcreteObserverA coa3=new ConcreteObserverA(); //让这三个观察者添加到subject观察者队伍中 subject.register(coa); subject.register(coa2); subject.register(coa3); subject.setState(1234); System.out.println(coa.getState()); System.out.println(coa2.getState()); System.out.println(coa3.getState()); subject.removeObserver(coa3); subject.setState(5678); System.out.println(coa3.getState()); } }

4.总结 上边我们通过代码手动实现了一个观察者模式,然而,jdk也提供了一些接口来方便我们实现这一功能。有兴趣的可以研究以下。 项目链接: https://github.com/MemoryExplosion/design_pattern_review/tree/master/src/java/observer

 

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-2614003.html

最新回复(0)