美文网首页
观察者模式—解耦的钥匙

观察者模式—解耦的钥匙

作者: dlihasa | 来源:发表于2019-07-11 14:52 被阅读0次

    观察者模式的定义

    定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于他的对象都会的到通知并被自动更新。

    观察者模式的使用场景

    (1)关联行为场景,关联行为是可以拆分的而不是“组合”关系
    (2)事件多级触发。
    (3)跨系统的消息交换场景,如消息队列、事件总线的处理机制。

    观察者模式实现方式(举例)

    观察者(订阅方)

    class Coder implements Observer{
        
        public String name;
        
        public Coder(String name){
            this.name = name;
        }
    
        @Override
        public void update(Observable arg0, Object arg1) {
            System.out.println("Hi,"+name+",Web更新啦,内容是---"+arg1);
            
        }
        
        public String toString(){
            return "coder:"+name;
        }
        
    }
    

    被观察者(发布方)

    class Web extends Observable{
        public void pushNews(String content){
            setChanged();
            notifyObservers(content);
        }
    }
    

    在主函数中调用:

    public class ObserverTest {
        
        public static void main(String[] args){
            //被观察者
            Web mWeb = new Web();
            //观察者
            Coder coder1 = new Coder("coder1");
            Coder coder2 = new Coder("coder2");
            Coder coder3 = new Coder("coder3");
            //将观察者注册到被观察者对象的观察者列表中
            mWeb.addObserver(coder1);
            mWeb.addObserver(coder2);
            mWeb.addObserver(coder3);
            //被观察者发布消息
            mWeb.pushNews("被观察者(发布方)发送给观察者(订阅方)的一条新消息");
        }
    
    }
    

    运行结果:

    Hi,coder3,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
    Hi,coder2,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
    Hi,coder1,Web更新啦,内容是---被观察者(发布方)发送给观察者(订阅方)的一条新消息
    

    Observer和Observable是JDK中的内置类型,也就是说Java对观察者做了支持。根据上面例子我们可以知道,观察者模式中:

    Observable抽象的被观察者把所有观察者对象的引用保存在一个集合里,可以添加和删除观察者;具体的被观察者将发生改变时的行为自行控制,给所有添加过的(也可以说是注册过的)观察者发送通知。
    Observer抽象的观察者,定义了更新接口,使得在得到被观察者的通知后更新自己;具体的观察者实现了更新接口,自行决定如何更新。

    在Android中的观察者模式

    Android中的ListView和RecyclerView的Adapter更新数据、广播接收器都用到了观察者模式。

    以ListView为例:ListView设置Adapter(调用setAdapter)时,会构建一个AdapterDataSetObserver,并且注册到Adapter中(其实就是将观察者通过调用Adapter内部的被观察者DataSetObservable添加观察者到观察者列表中去),在数据发生变化时,开发者手动调用notifyDataSetChanged方法,内部调用了DataSetObservable的notifyChanged方法,该方法会循环遍历之前添加到观察者列表中的观察者AdapterDataSetObserver,并调用他们的onChanged方法,onChanged方法会获取数据集的新数量,调用requestLayout重新布局,更新用户界面。

    相关文章

      网友评论

          本文标题:观察者模式—解耦的钥匙

          本文链接:https://www.haomeiwen.com/subject/ochrkctx.html