概述
观察者模式
观察者模式又称为发布/订阅(Publish/Subscribe)模式
在对象之间定义了一对多的依赖,这样一来,当一个对象改变状态,依赖它的对象会收到通知并自动更新。
如果这句话不好理解 可以这样理解,
微信公众号发布消息,订阅者获取消息,订阅了就能收到消息,没有订阅就不能收到消息
什么时候考虑使用观察者模式?
当对象间存在一对多关系时,则使用观察者模式
优点: 1、观察者和被观察者是抽象耦合的。 2、建立一套触发机制。
缺点: 1、如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。 2、如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。 3、观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。
下面写一个案例:一个微信公众号服务,不定时发布一些消息,关注公众号就可以收到推送消息,取消关注就收不到推送消息
1 抽象被观察这接口
//抽象被观察者接口
public interface Observerable {
//订阅
void registerObserver(Observer o);
//取消订阅
void removeObserver(Observer o);
//更新
void notifyObserver();
}
2 抽象观察者接口
//抽象观察者接口
public interface Observer {
//接受变动通知
public void update(String message);
}
3 观察者实现接口
// 观察者,订阅公众号的用户
public class User implements Observer {
private String name;
private String message;
public User(String name) {
// TODO Auto-generated constructor stub
this.name = name;
}
@Override
public void update(String message) {
// TODO Auto-generated method stub
this.message = message;
read();
}
private void read() {
// TODO Auto-generated method stub
System.out.println(name + " 收到推送消息: " + message);
}
}
4 被观察者实现接口
import java.util.ArrayList;
import java.util.List;
// 被观察者, 微信公众号
public class WechatServer implements Observerable {
//注意到这个List集合的泛型参数为Observer接口,设计原则:面向接口编程而不是面向实现编程
private List<Observer> list;
private String message;
public WechatServer() {
list = new ArrayList<Observer>();
}
@Override
public void registerObserver(Observer o){
list.add(o);
}
@Override
public void removeObserver(Observer o) {
if(!list.isEmpty())
list.remove(o);
}
//遍历
@Override
public void notifyObserver(){
for(int i = 0; i < list.size(); i++) {
Observer oserver = list.get(i);
oserver.update(message);
}
}
public void setInfomation(String s) {
this.message = s;
System.out.println("微信服务更新消息: " + s);
//消息更新,通知所有观察者
notifyObserver();
}
}
测试
public class Main{
public static void main(String[] args) {
//创建微信服务器对象
WechatServer server = new WechatServer();
//创建多个用户对象
User userZhang = new User("ZhangSan");
User userLi = new User("LiSi");
User userWang = new User("WangWu");
//订阅者用户接受消息
server.registerObserver(userZhang);
server.registerObserver(userLi);
server.registerObserver(userWang);
//微信服务器发送消息
server.setInfomation("PHP是世界上最好用的语言!");
System.out.println("------------华丽的分割线---------------");
//张三把订阅号给取消了
server.removeObserver(userZhang);
//微信服务器修改消息
server.setInfomation("JAVA是世界上最好用的语言!");
}
}
打印结果
参考地址忘记了,本着学习记录了一下。
最后
以上就是高贵心情为你收集整理的Java设计模式:观察者模式的全部内容,希望文章能够帮你解决Java设计模式:观察者模式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复