• 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. };

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

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

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

  • 相关阅读:
    溶出度质量标准的拟定注意事项
    SOLIDWORKS® 2024 新功能 - 3D CAD
    Zookeeper
    java毕业设计电子存证系统mybatis+源码+调试部署+系统+数据库+lw
    JAVA个人博客系统设计与实现 毕业设计开题报告
    MySQL主从复制(基于binlog日志方式)
    想进大厂?这些TCP协议知识你应该知道
    Javascript 数字精度丢失的问题,如何解决?
    PHPWord 模板输出checkbox复选框和checked已勾选状态,以及 模板替换时数据如何分行
    构建强大的Web应用之Django详解
  • 原文地址:https://blog.csdn.net/m0_37872216/article/details/126856599