设计模式——观察者模式

    xiaoxiao2026-09-21  1

    什么是观察者模式

    观察者模式有时被称作发布/订阅模式,观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己。 举个例子:传播点正能量,就拿里约奥运会来说吧。奥运会比赛就是被观察者,看奥运的人,我们大家就是观察者,在奥运会中国某个比赛赢了的时候,我们这些观察者就会做出一些反应,发微博啊,发朋友圈啊,这就是一对多的观察者模式的理解

    观察者模式编写

    回调

    这里先写个回调,感觉这样对下面观察者模式的编写会好理解一些。

    public class DemoCallBack { //编写接口跟回调方法 public interface CallbackListener { public void setCallback(String str); } //提供回调方法 public void setOnListener(CallbackListener callback){ callback.setCallback("回调"); } }

    回调:

    DemoCallBack callback=new DemoCallBack(); //监听回调 callback.setOnListener(new DemoCallBack.CallbackListener() { public void setCallback(String str) { System.out.println(str); } });

    观察者模式编写

    观察者模式有的编写分为4部分:2个抽象(抽象观察者+抽象被观察者)2个具体(具体观察者+具体被观察者) 抽象观察者:还是考虑上面奥运会的例子,观察者在看奥运之后只需要做出一些反应,所以抽象观察者里面是一些可以回调的抽象方法比如update(更新状态)。 抽象被观察者:看奥运会的人不止一个,也就是观察者不止一个,被观察者只有在知道有哪些观察者的情况下才能通知到这些观察者,因此在抽象被观察者这个类中至少需要有三个抽象方法:register(注册观察者),unregister(注销观察者),notify(通知所有观察者)。 具体观察者:看了奥运会我们都会有不同的反应,这里的反应就是我们状态的更新。 具体被观察者:具体的被观察者需要对register(注册观察者),unregister(注销观察者),notify(通知所有观察者)这三个方法进行具体的实现比如添加观察者,注销观察者之类的。

    抽象观察者

    public interface Observer { public void update(String str); }

    抽象观察者

    public interface Observered { public void register(Observer observer); public void notify(String str); public void unregister(Observer observer); }

    具体观察者

    public class ConcreteObserver implements Observer { public void update(String str) { System.out.println(str); } }

    具体被观察者

    public class ConcreteObservered implements Observered{ private List<Observer> observers=new ArrayList<Observer>(); //添加观察者 public void register(Observer observer) { observers.add( observer); } //遍历通知观察者 public void notify(String str) { for(int i=0;i<observers.size();i++){ observers.get(i).update(str+"ConcreteObserver"+i); } } //注销观察者 public void unregister(Observer observer) { observers.remove(observer); } }

    调用

    public class TestMain { /** * @param args */ public static void main(String[] args) { Observer obs1=new ConcreteObserver(); Observer obs2=new ConcreteObserver(); Observer obs3=new ConcreteObserver(); ConcreteObservered observered=new ConcreteObservered(); observered.register(obs1); observered.register(obs2); observered.register(obs3); observered.notify("通知所有观察者"); }

    补充

    在Android开发中观察者模式使用最明显的就是adapter中调用notifyDatasetchange或者是notify……的时候。还有RxAndroid也是观察者模式

    转载请注明原文地址: https://ju.6miu.com/read-1312178.html
    最新回复(0)