Java 回调函数 与 观察者模式

举报
福州司马懿 发表于 2021/11/19 04:46:25 2021/11/19
【摘要】 观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物...

观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实现事件处理系统。

什么时候使用观察者模式:

  • 当一个抽象模型有两个方面, 其中一个方面依赖于另一方面。将这二者封装在独立的对象中以使它们可以各自独立地改变和复用。
  • 当对一个对象的改变需要同时改变其它对象, 而不知道具体有多少对象有待改变。
  • 当一个对象必须通知其它对象,而它又不能假定其它对象是谁。换言之, 你不希望这些对象是紧密耦合的。

其实观察者模式同前面讲过的桥梁、策略有着共同的使用环境:将变化独立封装起来,以达到最大的重用和解耦。观察者与后两者不同的地方在于,观察者模式中的目标和观察者的变化不是独立的,而是有着某些联系。

在Java中通过Observable类和Observer接口实现了观察者模式。一个Observer对象监视着一个Observable对象的变化,当Observable对象发生变化时,Observer得到通知,就可以进行相应的工作。

package com.demo.test;

import java.util.Observable;
import java.util.Observer;

//观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用
public class ObserverCallbackDemo {

    // 观察者A
    static class ConcreteObserverA implements Observer {

        @Override
        public void update(Observable o, Object arg) {
            System.out.println("ConcreteObserverA update");
        }

    }

    // 观察者B
    static class ConcreteObserverB implements Observer {

        @Override
        public void update(Observable o, Object arg) {
            System.out.println("ConcreteObserverB update");
        }

    }

    // 被观察对象
    static class ConcreteObservable extends Observable {
        public void changeValue() {
            //protected方法只能在子类被调用
            setChanged();
            notifyObservers();
        }
    }

    // 回调函数接口
    interface ICallback {
        public void onCall();
    }

    // 回调类
    static class CallbackDemo {
        private ICallback callback;

        public void setListener(ICallback callback) {
            this.callback = callback;
        }

        public void call() {
            callback.onCall();
        }
    }

    public static void main(String[] args) {
        // 观察者
        ConcreteObserverA observerA = new ConcreteObserverA();
        ConcreteObserverB observerB = new ConcreteObserverB();
        ConcreteObservable observable = new ConcreteObservable();
        observable.addObserver(observerA);
        observable.addObserver(observerB);
        System.out.println("countObservers = " + observable.countObservers());
        observable.changeValue();

        // 回调函数
        CallbackDemo callbackDemo = new CallbackDemo();
        callbackDemo.setListener(new ICallback() {

            @Override
            public void onCall() {
                System.out.println("callback onCall");
            }
        });
        callbackDemo.call();
    }
}
  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77

输出结果:

countObservers = 2
ConcreteObserverB update
ConcreteObserverA update
callback onCall
  
 
  • 1
  • 2
  • 3
  • 4

从上面代码可以看出:回调函数应该属于观察者模式的一种,目的是为了替代轮循机制,将组件之间的耦合性降低。观察者模式里面目标类维护了所有观察者的引用,而回调里面只是维护了一个引用。

文章来源: blog.csdn.net,作者:福州-司马懿,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/chy555chy/article/details/52777989

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。