观察者模式定义了对象之间的一对多依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。而观察者模式属于行为型模式,行为型模式关注的是对象之间的通讯,观察者模式就是观察者和被观察者之间的通讯。
举个栗子:童鞋们观察灯.
在此栗子中童鞋们是观察者,而灯是可观察者(被观察者).灯打开或者灯熄灭,童鞋们都能接收得到这个事件.并及时响应该事件做相应处理.
在观察者模式中一般会涉及到几点: 抽象观察者,抽象可观察者.观察者以及可观察者.
代码实现 :张三,李四,王五订阅微信公众号.
// 定义抽象可观察者. 公众号一般会有 订阅,取消订阅,以及通知提醒功能.
public interface Observerable {
/***
* 注册事件
*/
void registerObserver(Observer o);
/***
* 取消事件
*/
void cancleObserver(Observer o);
/***
* 更新事件 发送一条推送通知
*/
void notifynObserver();
}
// 订阅抽象观察者
public interface Observer {
/***
* 定义一个update 方法,当被观察者<微信公众号> 发布事件的时候,会执行该方法.
* @param message
*/
void update(String message);
}
实体类 可观察者
public class WechatServer implements Observerable {
private List<Observer> observerList; // 存储订阅该公众号的observer<观察者 人>
private String message;
public WechatServer() {
observerList = new ArrayList<>();
}
@Override
public void registerObserver(Observer o) {
observerList.add(o);
}
@Override
public void cancleObserver(Observer o) {
observerList.remove(o);
}
/***
* 通知每一个订阅者 接收消息.
*/
@Override
public void notifynObserver() {
for (int i = 0; i < observerList.size(); i++) {
Observer observer = observerList.get(i);
observer.update(message);
}
}
/***
* 公众号每次推的消息
*/
public void setInfoMsg(String msg){
this.message = msg;
System.out.println("微信公众号推送消息: " + msg);
// 消息来临 通知每一个订阅者
notifynObserver();
}
}
实体类 观察者
public class UserObserverable implements Observer{
private String name;
public UserObserverable(String name) {
this.name = name;
}
@Override
public void update(String message) {
System.out.println(name + " 订阅者接收到消息:"+message);
}
}
如何关联两者之间的关系呢?
WechatServer server = new WechatServer();
Observer zhangsan = new UserObserverable("zhangsan");
Observer lisi = new UserObserverable("lisi");
Observer wangwu = new UserObserverable("wangwu");
server.registerObserver(lisi);
server.registerObserver(wangwu);
server.registerObserver(zhangsan);
server.setInfoMsg("PHP是世上最好的语言");
server.cancleObserver(lisi); // 这里取消了订阅
server.setInfoMsg("flutter 重磅来袭!!");
张三,李四,王五,都订阅了微信公众号.接着公众号推了一条提醒"PHP是世上最好的语言".而然,李四很不爽,取消了微信公众号.公众号继续推了一条了 "flutter 重磅来袭!!" 由于,"flutter 重磅来袭!!" 是在李四取消之后推送的,继而李四不会收到消息.

发布订阅者模式
在发布订阅者模式中,发布者不会直接将消息告知订阅者,而是通过第三种组件来告知.这样一来,发布者与订阅者不存在任何关联.而第三种组件我们称为代理或消息代理或事件总线,它是发布者和订阅关联者,它过滤所有传入的消息并相应地分发给订阅者.
在发布者/订阅者中,发布者和订阅者不需要彼此了解。他们只是在消息队列或代理的帮助下进行通信。
最经典栗子: EventBus


简而言之,这两种模式之间的主要区别可以如下所示:

网友评论