Android 进阶之路:常见设计模式之观察者模式

想成为高级Android工程师其中熟悉常见的设计模式是必不可少的,这个也是我面试一线互联网公司的深刻体会,在Android中有很多是基于观察者模式实现的比如EventBus,Rxjava的实现都是基于观察者模式的思想(这个会在接下来的博客里具体分析EventBus和Rxjava原理)。再比如回调函数:Android中对Button的点击监听(这个和观察者模式其实是有区别的,但是在思想上也算是观察者模式的一个特例吧,下面会介绍)。现在介绍最基础也是最常用的设计模式:观察者模式
假设一个应用场景作为对于报社的抽象,每隔两秒钟向用户发送报纸;User作为用户的抽象,可以收到报纸
一、创建主题(被观察者报社)接口和观察者接口

/**
 * 被观察者接口定义(主题)
 */
public interface MyObserverable {

    void register(MyObserver myObserver);

    void remove(MyObserver myObserver);

    void send(NewsModel model);

}
/**
 * 观察者接口定义
 */
public interface MyObserver {

    void receive(NewsModel model);

}

二、实例化观察者和被观察者(主题)

/**
 * 对于报社的抽象,实现了被观察者(主题)接口,每隔2s发送一次报纸
 */
public class NewsProvider implements MyObserverable {
    private static final long DELAY = 2 * 1000;
    private List<MyObserver> mObservers; //我们用一个List来维护所有的观察者对象

    public NewsProvider() {
        mObservers = new ArrayList<>();
        generateNews();
    }

    /**
     * 模拟产生新闻,每个2s发送一次
     */
    private void generateNews() {
        Timer timer = new Timer();
        timer.schedule(new TimerTask() {
            int titleCount = 1;
            int contentCount = 1;

            @Override
            public void run() {
                send(new NewsModel("title:" + titleCount++, "content:" + contentCount++));
            }
        }, DELAY, 1000);
    }

    @Override
    public void register(MyObserver myObserver) {
        if (myObserver == null)
            return;
        synchronized (this) {
            if (!mObservers.contains(myObserver))
                mObservers.add(myObserver);
        }
    }

    @Override
    public synchronized void remove(MyObserver myObserver) {
        mObservers.remove(myObserver);
    }

    @Override
    public void send(NewsModel model) {
        for (MyObserver observer : mObservers) {
            observer.receiveNews(model);
        }
    }
}
/**
 * 对于用户的抽象
 */
public class User implements MyObserver {
    private String mName;

    public User(String name) {
        mName = name;
    }

    @Override
    public void receive(NewsModel model) {
        System.out.println(mName + " receive news:" + model.getTitle() + "  " + model.getContent());
    }
}

三、使用测试

/**
 * 测试类
 */
public class Test {
    public static void main(String[] args) {
        NewsProvider provider = new NewsProvider();
        User user;
        for (int i = 0; i < 10; i++) {
            user = new User("user:"+i);
            provider.register(user);
        }
    }
}

总结观察者模式和接口回调区别
接口回调,(一对一)是Java多态的一种体现, 可以把使用某一接口的实现类创建的对象的引用, 赋给该接口声明的接口变量中, 那么该接口变量就可以调用被实现的接口中的方法, 当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。

观察者模式,(一对多)是将观察者和被观察的对象分离开, 当被观察的对象产生一定变化的时候, 观察者就会根据哪里产生的变化, 产生了变化, 而进行相应的处理.备注:大部分观察着模式是用接口回调的方法来实现的.前者是一种体现, 后者是一种用前者实现的模式, 相当于后者调用前者。接口回调算是java语法层面的,还上升不到设计模式的高度
资料引用 http://www.jianshu.com/p/1025f644f100

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值