设计模式-观察者模式
本篇只作简要代码示例,不做“学术讨论”!
1. 观察者模式介绍
观察者又称:订阅-发布模式!
从生活中寻找观察者模式的示例,以通俗易懂的话语讲解“观察者模式”:微信公众号!
微信公众号:当我们关注某公众号时,我们就成为这个公众号的订阅者,这个公众号一旦有消息会执行发布,此时订阅者就会接收到发布信息。(消息推送也是如此,还有其他很多的示例就不一一列举)
想要实现一个简易的观察者模式?请往下看
2. 观察者模式实现
1. 思考观察者模式所具备的属性或特征
- 需要一个观察者、若干个订阅者!
- 观察者发布信息,订阅者接收信息!
- 订阅者可以订阅,订阅者可以取消订阅!
- 其他若干健壮性的设计,如:避免重复订阅,以及其他!
2. 代码实现
观察者
import android.support.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* @author air.
* </p>
* <p>
* 拥有属性、标签:
* 观察者模式
* {@link #registerPushReceiver(IPushReceiver)}
* {@link #unRegisterPushReceiver(IPushReceiver)}
* {@link #notifyRegisterReceiver(PushPublish)}
* </p>
*/
public class PushManager {
private static final List<IPushReceiver> mPushReceivers = new ArrayList<>();
private PushManager() {
}
static class Holder {
static final PushManager INSTANCE = new PushManager();
}
public static PushManager getInstance() {
return Holder.INSTANCE;
}
/**
* 绑定消息推送的订阅者
*
* @param registerReceiver 绑定的订阅者
* @return 操作是否成功执行
*/
boolean registerPushReceiver(@Nullable IPushReceiver registerReceiver) {
if (registerReceiver == null) {
return false;
}
if (mPushReceivers.contains(registerReceiver)) {
//已经注册,则不许要再重复注册!
return false;
}
//注册
mPushReceivers.add(registerReceiver);
return true;
}
/**
* 解绑消息推送的订阅者
*
* @param unRegisterReceiver 解绑的订阅者
* @return 操作是否成功执行
*/
boolean unRegisterPushReceiver(@Nullable IPushReceiver unRegisterReceiver) {
if (unRegisterReceiver == null) {
return false;
}
if (!mPushReceivers.contains(unRegisterReceiver)) {
//未注册,则不需要解绑注册!
return false;
}
//解绑注册
mPushReceivers.remove(unRegisterReceiver);
return true;
}
/**
* 通知订阅者数据需要更新
*
* @param pushPublish 更新的数据
* @return 操作是否成功执行
*/
boolean notifyRegisterReceiver(@Nullable PushPublish pushPublish) {
if (pushPublish == null) {
return false;
}
//制定统一的数据
PushMessage pushMessageTemplate = new PushMessage();
pushMessageTemplate.setMsg(pushPublish.getMsgTip());
for (IPushReceiver receiver :
mPushReceivers) {
//另开数据传递给接收者
PushMessage pushMessage = pushMessageTemplate;
receiver.receiver(pushMessage);
}
return true;
}
}
订阅者
/**
* <p>
* @author air.
* </p>
*/
public interface IPushReceiver {
void receiver(PushMessage pushMessage);
}
观察者发布的消息(这里多个数据的中间处理操作)
import android.support.annotation.Nullable;
/**
* <p>
* @author air.
* </p>
*/
public class PushPublish {
@Nullable
private String id;
@Nullable
private String msgTip;
public void setId(@Nullable String id) {
this.id = id;
}
public void setMsgTip(@Nullable String msgTip) {
this.msgTip = msgTip;
}
@Nullable
public String getId() {
return id;
}
@Nullable
public String getMsgTip() {
return msgTip;
}
}
订阅者收到的消息
/**
* <p>
* @author air.
* </p>
*/
public class PushMessage {
String msg;
public void setMsg(String msg) {
this.msg = msg;
}
public String getMsg() {
return msg;
}
}
测试
/**
* <p>
* @author air.
* </p>
*/
public class PushTest {
public static void main(String[] args){
PushManager pushManager = PushManager.getInstance();
//注册订阅者
pushManager.registerPushReceiver(new IPushReceiver() {
@Override
public void receiver(PushMessage pushMessage) {
System.out.printf(""+pushMessage.getMsg());
}
});
//通知订阅者
PushPublish publish = new PushPublish();
publish.setId("ID");
publish.setMsgTip("有新消息,请查收!");
pushManager.notifyRegisterReceiver(publish);
}
}
3. TODO
进一步扩充、丰富、完善相关内容!
未完待续。。。