• java 低耦合观察者模式


     
    

    在之前的文章观察者模式中,虽然被观察者并不依赖于观察者,但是被观察者知道观察者的存在,这就出现了一定程度的耦合关系。

    我们通常希望一个观察者模式是这样的:

    1.观察者依赖于被观察者,被观察者不依赖于观察者。

    2.被观察者最好不知道观察者的存在,既能独立工作,又能减少与观察者的耦合关系。

    源代码

    EventListener.java:

    1. package com.example.listenertest;
    2. //监听器接口,监听器是该接口的一个实例
    3. public interface EventListener {
    4. //回调函数
    5. void onComplete();
    6. }

    Observer.java: 

    1. package com.example.listenertest;
    2. import android.util.Log;
    3. public class Observer {
    4. public final static String TAG = "ObserverTest";
    5. Subject mSubject;
    6. //观察者构造函数,观察者必须依赖于某个被观察者,并且向其注册监听器
    7. public Observer(Subject subject){
    8. mSubject = subject;
    9. setOBListener();//注册监听器
    10. }
    11. //监听器,被观察者通过该监听器通知观察者
    12. EventListener mEventListener = new EventListener() {
    13. @Override
    14. public void onComplete() {
    15. Log.d(TAG, "Subject Complete!");
    16. }
    17. };
    18. //向被观察者设置监听器
    19. void setOBListener(){
    20. mSubject.setListener(mEventListener);
    21. }
    22. }

    Subject.java: 

    1. package com.example.listenertest;
    2. import android.util.Log;
    3. public class Subject {
    4. public final static String TAG = "ObserverTest";
    5. //内置一个监听器,该监听器由观察者赋值
    6. EventListener mEventListener = null;
    7. //内置监听器赋值方法
    8. void setListener(EventListener listener){
    9. mEventListener = listener;
    10. }
    11. //通知发送方法
    12. void onNotify(){
    13. if(mEventListener != null){
    14. //如果确实注册了监听器,就通过监听器回调观察者的方法
    15. mEventListener.onComplete();
    16. }
    17. }
    18. //模拟的工作内容
    19. void subjectWork(){
    20. Log.d(TAG, "subject is working!");
    21. onNotify();//工作完成了发送通知
    22. }
    23. }

     MainActivity.java:

    1. package com.example.listenertest;
    2. import androidx.appcompat.app.AppCompatActivity;
    3. import android.os.Bundle;
    4. public class MainActivity extends AppCompatActivity {
    5. @Override
    6. protected void onCreate(Bundle savedInstanceState) {
    7. super.onCreate(savedInstanceState);
    8. setContentView(R.layout.activity_main);
    9. Subject sub = new Subject();
    10. Observer ob = new Observer(sub);
    11. //被观察者开始工作
    12. sub.subjectWork();
    13. }
    14. }

    结果:

    代码讲解 

    首先说明一下设计思路。为了降低观察者与被观察者的耦合程度,我们采用一种“监听器”作为观察者与被观察者之间的联系,这样的话被观察者只知道监听器的存在,而不知道观察者的存在,降低了耦合程度。 

    监听器 

    从源代码中可以看出,监听器是一个接口的实例,该实例由观察者实现。

    1. //监听器,被观察者通过该监听器通知观察者
    2. EventListener mEventListener = new EventListener() {
    3. @Override
    4. public void onComplete() {
    5. Log.d(TAG, "Subject Complete!");
    6. }
    7. };

     该接口内的函数都是回调函数,可以被该接口的实例调用。

    我们将该实例传给被观察者,被观察者持有这个实例(监听器)之后就可以通过它调用里面的回调函数,就实现了向观察者的消息通知。

    之前被观察者持有的是观察者的引用,现在持有的是观察者送它的监听器,本身并不知道监听器是谁给它的,明显降低了耦合程度。

  • 相关阅读:
    ch06 C语言的内存结构
    GBase 8c V3.0.0数据类型——系统表信息函数
    2022G3锅炉水处理考试练习题模拟考试平台操作
    MVVM模式根模块
    Seata 分布式事务框架
    php 剪裁背景图,滑动图片,滑动验证
    MM32F0140 UART1硬件自动波特率校准功能的使用
    HTML5期末大作业:动漫网站设计——神偷奶爸(10页) HT简单个人网页设计作业 静态动漫主题网页作业 DW个人网站模板下载
    最简单的共享列表服务器KissLists
    算法设计与分析复习知识
  • 原文地址:https://blog.csdn.net/m0_37872216/article/details/126856599