观察者模式

2019-02-25  本文已影响0人  1dot4

定义

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

类图

observer.png

简单实现

这里举一个例子,订阅某个微信公众号,公众号有消息更新会第一时间推送给我们,下面就简单实现一下。

抽象观察者类

//抽象观察者类,为所有具体观察者定义一个接口,在的到通知时通知自己
public interface Observer   {
    //有更新
    public void update(String message);
}

抽象被观察者类对象

//抽象被观察者类
public interface Observable {
    //推送消息
    void push(String message);
    
    //订阅
    void register(Observer observer);
}

具体观察者类

//具体的观察者类,也就是订阅者
public class User implements Observer {

    private String name;
    
    public User(String name) {
        this.name = name;
    }
    
    @Override
    public void update(String message) {
        System.out.println(name+","+mesage+"更新了!");
    }

}

具体的被观察者类

//具体的被观察者类,也就是订阅的公众号
public class Subscriptions implements Observable {
    private List<Observer> mList = new ArrayList<>();//存储订阅者
    
    @Override
    public void push(String message) {
        for(Observer ob : mList) {
            ob.update(message);
        }
        
    @Override
    public void register(Observer ob) {
        mList.add(ob);
    }
    
}

实现

public class Client {
    public static void main(String[] args){
        //被观察者,这里是公众号
        Subscriptions  subscription = new  Subscriptions();
        //观察者,这里是订阅用户
        User u1=new User("Tony");
        User u2=new User("Tom");
        User u3=new User("Tomas");
        //订阅
        subscription.register(u1);
        subscription.register(u2);
        subscription.register(u3);
        //推送消息
        subscription.register("xxx公众号");
    }
}

结果

Tony,xxx公众号更新了!
Tom,xxx公众号更新了!
Tomas,xxx公众号更新了!

安卓源码中的使用观察者模式的场景

OnClickListener,对设置OnClickListener来说,View是被观察者,OnClickListener是观察者,二者通过setOnClickListener()方法达成订阅关系。订阅后用户点击按钮的瞬间,Android Framework就会将点击事件发送给已经注册的OnClickListener。采取这样被动的方式,既省去了反复检索状态的资源消耗,也能够达到最高的反馈速度。

上一篇 下一篇

猜你喜欢

热点阅读