Android 进阶之路:常见设计模式之观察者模式
2017-12-14 13:52
281 查看
想成为高级Android工程师其中熟悉常见的设计模式是必不可少的,这个也是我面试一线互联网公司的深刻体会,在Android中有很多是基于观察者模式实现的比如EventBus,Rxjava的实现都是基于观察者模式的思想(这个会在接下来的博客里具体分析EventBus和Rxjava原理)。再比如回调函数:Android中对Button的点击监听(这个和观察者模式其实是有区别的,但是在思想上也算是观察者模式的一个特例吧,下面会介绍)。现在介绍最基础也是最常用的设计模式:观察者模式
假设一个应用场景作为对于报社的抽象,每隔两秒钟向用户发送报纸;User作为用户的抽象,可以收到报纸
一、创建主题(被观察者报社)接口和观察者接口
二、实例化观察者和被观察者(主题)
三、使用测试
总结观察者模式和接口回调区别
接口回调,(一对一)是Java多态的一种体现, 可以把使用某一接口的实现类创建的对象的引用, 赋给该接口声明的接口变量中, 那么该接口变量就可以调用被实现的接口中的方法, 当接口变量调用被类实现的接口中的方法时,就是通知相应的对象调用接口的方法。
观察者模式,(一对多)是将观察者和被观察的对象分离开, 当被观察的对象产生一定变化的时候, 观察者就会根据哪里产生的变化, 产生了变化, 而进行相应的处理.备注:大部分观察着模式是用接口回调的方法来实现的.前者是一种体现, 后者是一种用前者实现的模式, 相当于后者调用前者。接口回调算是java语法层面的,还上升不到设计模式的高度
资料引用 http://www.jianshu.com/p/1025f644f100
假设一个应用场景作为对于报社的抽象,每隔两秒钟向用户发送报纸;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
相关文章推荐
- Android 进阶之路:常见设计模式之建造模式
- Android 进阶之路:常见设计模式之适配器模式
- Android 进阶之路:常见设计模式之工厂模式
- Android 进阶之路:常见设计模式之代理模式二
- Android 进阶之路:常见设计模式之装饰模式
- 常见的设计模式详解:单例模式、工厂模式、观察者模式
- [Android&Java]浅谈设计模式-代码篇:观察者模式Observer
- Android开发----几大设计模式(单例模式、Builder模式、观察者模式、原型模式、策略模式)
- Android的设计模式-观察者模式
- Android开发中常见的设计模式
- Android开源—RXJava观察者设计模式
- Android设计模式(2)-----观察者模式
- 个人理解的Android设计模式之观察者模式
- Android设计模式之观察者模式
- Android设计模式学习日记03--观察者模式
- Android设计模式之观察者模式 Observer
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- 浅学设计模式之观察者<Observer>模式及在android中的应用
- Android 设计模式 之 观察者模式
- Android 设计模式 之 观察者模式详解