观察者设计模式的理解

本文介绍了观察者设计模式,它是一种行为型设计模式,也叫发布订阅模式,包含被观察者和观察者两个角色。被观察者维护观察者列表,事件发生时通知观察者。还给出了代码实现,包括观察者、被观察者、消息封装、测试代码,并展示了运行结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、概念

观察者设计模式: 行为型的设计模式,也叫作发布订阅模式。
两个角色:被观察者(Observer),观察者(Observerable)。
被观察者维护观察者实例列表,当有事件发生时,调用观察者的方法进行通知。

二、代码实现

1、观察者

/**
 * 观察者
 */
public interface Observer {
    // 被观察者有事件产生时,通过这个方法通知观察值
    public void onMessage(EventObject eventObject);
}

/**
 * 观察者实例
 */
public class MyObserver1 implements Observer {
    @Override
    public void onMessage(EventObject eventObject) {
        Log.d("lixm","我是Observer_1,我收到了消息。。。" + eventObject.data);
    }
}

/**
 * 观察者实例
 */
public class MyObserver2 implements Observer {
    @Override
    public void onMessage(EventObject eventObject) {
        Log.d("lixm","我是Observer_2,我收到了消息。。。"  + eventObject.data);
    }
}

2、被观察者

/**
 * 被观察者
 */
public interface Observerable {
    public void registerObserver(Observer observer);
    public void removeObserver(Observer observer);
    public void sendMsg2Observer(EventObject eventObject);
}

/**
 * 被观察者实例
 */
public class MyObserverable implements Observerable {

    private static MyObserverable instance; // 单例

    private MyObserverable(){};  // 不让别人new

    public List<Observer> observers; // 用于存放观察者

    public static MyObserverable getInstance(){
        if(instance == null){
            synchronized (MyObserverable.class){
                if(instance == null){
                    instance = new MyObserverable();
                }
            }
        }
        return instance;
    }

    @Override
    public void registerObserver(Observer observer) {
        if(observers == null){
            observers = new ArrayList<>();
        }
        observers.add(observer);
    }

    @Override
    public void removeObserver(Observer observer) {
        if(observers != null && observers.size() > 0){
            observers.remove(observer);
        }
    }

    @Override
    public void sendMsg2Observer(EventObject eventObject) {
        if(observers != null && observers.size() > 0){
            for(Observer observer : observers){
                if(eventObject != null){
                    observer.onMessage(eventObject);
                }
            }
        }
    }
}

3、消息的封装

/**
 * 发送事件的封装
 */
public class EventObject {
    public String action;
    public String type;
    public Object data;
}

4、测试代码

public class TestActivity extends Activity {
    public Observer observer1;
    public Observer observer2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_test_observer);
        observer1 = new MyObserver1();

        observer2 = new MyObserver2();

        MyObserverable.getInstance().registerObserver(observer1);
        MyObserverable.getInstance().registerObserver(observer2);

        Button btnSendMsg = (Button)findViewById(R.id.btnSendMsg);

        btnSendMsg.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EventObject eventObject = new EventObject();
                eventObject.action = "EVENT_ACTION_ONCLICK";
                eventObject.data = "发生了点击事件";

                MyObserverable.getInstance().sendMsg2Observer(eventObject);
            }
        });
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        MyObserverable.getInstance().removeObserver(observer1);
        MyObserverable.getInstance().removeObserver(observer2);
    }
}

//==========R.layout.activity_test_observer==================

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
              android:padding="@dimen/md_common_padding"
    android:orientation="vertical">
    
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/llV"
        android:orientation="vertical">
        <Button
            android:id="@+id/btnSendMsg"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:clickable="true"
            android:text="发送事件"/>
    </LinearLayout>
</LinearLayout>

5、运行结果

07-10 08:35:05.692 3942 3942 D lixm : 我是Observer_1,我收到了消息。。。发生了点击事件
07-10 08:35:05.692 3942 3942 D lixm : 我是Observer_2,我收到了消息。。。发生了点击事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值