您的位置:首页 > 移动开发 > Android开发

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

2017-12-14 13:52 281 查看
想成为高级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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息