观察者模式,也叫发布/订阅模式,在对象之间定义1对多的单向依赖关系,使目标对象发生改变时,观察者对象可以即时收到消息并作出处理。
一、4个元素
1、目标对象接口
2、目标对象
3、观察者接口
4、观察者对象
二、核心原理
观察者模式利用单向依赖的方式完全解耦对象关系,目标对象发生改变时无需关心观察者对象实例。符合依赖倒转原则 和 接口隔离原则。
三、示例代码
1、目标对象接口
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 被观察者接口,用于注册/反注册/通知。
*/
public interface ISubject {
void registerObserver(IObserver observer);
void unRegisterObserver(IObserver observer);
void notifyDataByChanged(Object obj);
}
2、观察者接口
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 观察者接口
*/
public interface IObserver {
void update(Object obj);
}
3、目标对象
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 被观察者实体 = 例如推送工具
*/
public class PushSubject implements ISubject {
private List<IObserver> observers;
@Override
public void registerObserver(IObserver observer) {
if (observers == null) {
observers = new ArrayList<>();
}
observers.add(observer);
}
@Override
public void unRegisterObserver(IObserver observer) {
if (observers != null) {
observers.remove(observer);
}
}
@Override
public void notifyDataByChanged(Object obj) {
if (observers == null) {
return;
}
for (IObserver i : observers) {
i.update(obj);
}
}
public void ReceiveMsg(String message) {
// 接收到推送消息,需要通知其他地方处理消息
this.notifyDataByChanged(message);
}
}
4、观察者对象
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 观察者/订阅者:android手机端
*/
public class AndroidOb implements IObserver {
@Override
public void update(Object obj) {
Log.d("common", "Android手机收到通知了:" + obj.toString());
}
}
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 观察者/订阅者/iOS端
*/
public class IosOb implements IObserver {
@Override
public void update(Object obj) {
Log.d("common", "Ios手机收到通知了:" + obj.toString());
}
}
5、使用
/**
* 作者: Created by AdminFun
* 邮箱: 614484070@qq.com
* 创建: 2019/1/8
* 修改: 2019/1/8
* 版本: v1.0.0
* 描述: 观察者模式,也叫发布/订阅模式
* 定义:在对象之间定义1对多的单向依赖关系,使目标对象发生改变时,观察者对象可以收到消息。
* 角色:目标对象接口、目标对象、观察者接口、观察者对象
* 目的:利用单向依赖方式完全解耦对象关系,目标对象发生改变时无需关心观察者对象实例。
* 符合依赖倒转原则 和 接口隔离原则
*/
public class ObserverTest {
public static void main() {
PushSubject observered = new PushSubject();
observered.registerObserver(new AndroidOb());
observered.registerObserver(new IosOb());
observered.registerObserver(new IObserver() {
@Override
public void update(Object obj) {
Log.d("common", "测试类也收到了消息:" + obj.toString());
}
});
// 测试收到推送消息
observered.ReceiveMsg("还有1个月要过年了。");
}
}
打印结果
// Android手机收到通知了:还有1个月要过年了。
// Ios手机收到通知了:还有1个月要过年了。
// 测试类也收到了消息:还有1个月要过年了。