—-慢慢来比较快,虚心学技术—-
概念
又称为发布-订阅者模式,定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖它的对象都会得到通知并自动更新。
让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己
角色:
抽象主题(Subject)**:把所有观察者保存到一个集合中,可以有任意数量观察者,抽象主题提供接口以增加和移除观察者对象。(即抽象被观察者)
具体主题(ConcreteSubject)**:实现抽象主题,当主题状态发生变化时,通知集合中所有的观察者(即具体被观察者)
抽象观察(Observer)**:为所有具体观察者定义一个统一接口,在收到主题的通知时更新自身
具体观察(ConcreteObserver)**:实现抽象观察,以便在收到主题的通知时更新自身
实例
需求**:作为明星,拥有无数粉丝,那么每次自己更新动态都会通知到每一位粉丝**
粉丝抽象类(抽象观察者):
interface Fans{//获取粉丝名称String getFansName();//更新粉丝信息void update(String message);}
粉丝具体类(具体观察者):
class ConcreteFans implements Fans{private String fansName;public ConcreteFans(String fansName){this.fansName = fansName;}public String getFansName(){return this.fansName;}@Overridepublic void update(String message) {System.out.println(fansName + " 收到消息:===========" + message);}}
明星抽象类(抽象主题):
interface Star {//增加粉丝void addFans(Fans fans);//移除粉丝void removeFans(Fans fans);//发布消息void post(String message);//通知粉丝void notify(String message);}
明星具体类(具体主题):
class ConcreteStar implements Star{//明星名称String startName;public ConcreteStar(String startName){this.startName = startName;}/*** 粉丝列表*/private List<Fans> fansList = new ArrayList<>();@Overridepublic void addFans(Fans fans) {System.out.println("明星 "+startName+" 多了个粉丝:"+fans.getFansName());fansList.add(fans);}@Overridepublic void removeFans(Fans fans) {System.out.println("明星 "+startName+" 移除了粉丝:"+fans.getFansName());fansList.remove(fans);}@Overridepublic void post(String message) {message = "明星 "+startName+" 发布动态:"+message;System.out.println(message);//通知粉丝notify(message);}@Overridepublic void notify(String message) {for (Fans fans : fansList)fans.update(message);}}
调用:
Star star = new ConcreteStar("刘美眉");Fans fans1 = new ConcreteFans("虹桥一姐");Fans fans2 = new ConcreteFans("真爱粉刘一手");Fans fans3 = new ConcreteFans("黑粉史无心");//新增粉丝star.addFans(fans1);star.addFans(fans2);star.addFans(fans3);//发布消息star.post("今天很开心,我演唱会很成功!!!");
结果:每个粉丝都得到通知,明星发布了动态
明星 刘美眉 多了个粉丝:虹桥一姐明星 刘美眉 多了个粉丝:真爱粉刘一手明星 刘美眉 多了个粉丝:黑粉史无心明星 刘美眉 发布动态:今天很开心,我演唱会很成功!!!虹桥一姐 收到消息:===========明星 刘美眉 发布动态:今天很开心,我演唱会很成功!!!真爱粉刘一手 收到消息:===========明星 刘美眉 发布动态:今天很开心,我演唱会很成功!!!黑粉史无心 收到消息:===========明星 刘美眉 发布动态:今天很开心,我演唱会很成功!!!
应用场景
对象之间存在一对多的关系,一个对象的更改会影响其他对象。
多用于订阅功能,如微博的订阅、MQ设计,Spring事件机制等
**
优点
降低目标与观察者的耦合关系,实现抽象耦合,且两者之间建立了触发机制
**
缺点
观察者多的时候,发布消息的时间就会延长,影响程序效率。
目标与观察者并没有完全消除依赖关系,可能导致循环引用
如有贻误,还请评论指正
