设计模式--观察者模式

来源:互联网 发布:斩赤红之瞳黑瞳cos淘宝 编辑:程序博客网 时间:2024/05/21 12:49

观察者模式

场景

自从小张上次使用了策略模式,游戏增加了很多武器营收显著增加。产品部门计划增加游戏中用户之间的互动。如果用户关注了另一个用户,被关注用户有新的游戏动态,关注者会及时收到消息。

由于小张上次表现的不错,老王准备继续把这个重任交给小张。

小张的需求理解

这个需求,本质就是被关注者的最新动态要及时发送给关注者。小张仔细思考,发现这个需求和现实生活中订阅报纸的场景很相像。

现实生活中的订阅报纸

订阅报纸流程图:

订阅报纸流程图

小张这次没有着急开始编码,分析了需求并且找到了现实生活中的真实场景,回想起上次了解 策略模式时看到了设计模式的定义:

设计模式是对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。
设计模式并不直接用来完成代码的编写,而是描述在各种不同情况下,要怎么解决问题的一种方案。设计模式能使不稳定依赖于相对稳定,具体依赖于相对抽象,避免会引起麻烦的紧耦合,以增强软件设计面对并适应变化的能力。

既然设计模式是反复出现问题的解决方案,那么现实生活中是否还有相同的业务场景。小张开始仔细思考现实生活中接触到的场景。

现实生活中的更多场景

  • 微信订阅公众号
  • 微信朋友圈(会看到好友的动态,并且可以屏蔽不看)
  • 订阅博客
  • 订牛奶

    。。。。。

观察者模式

小张带着自己的思考,向经验丰富的老王求教。

老王:小张,现在进步很进步很快啊,这次这个需求在现实生活中有很多应用场景,观察者模式就是解决这个场景的方案。


小张:观察者模式?具体是如何实现的呢?

老王:小张啊,师傅领进门,修行看个人,既然你已经知道了需要用观察者模式来实现这个需求,那么就要利用网络的资源,去进行学习。
我们程序员需要学的东西很多,往往别人只能给你点拨一下,具体的了解还是要靠 百度,谷歌,stackoverflow来进行深入的学习,如果要系统的学习,你可以买上几本经典的书。

小张:明白,感谢王哥的指导。
小张开始在网络上疯狂的了解观察者模式,经过一个上午的了解,小张准备开始编码。

小张的实现

具体的代码

/** * 观察者接口 * 也就是这个场景的:关注者 */interface Observer{    public  void follower(Subjetct subjetct);//关注    public void receiveDynamic(String message);//接受新的动态}/** * 主题接口 * 也就是这个场景的:被关注者 * 当它有新的动态会及时推送到它的关注者 */interface Subjetct{     List<Observer> observerList = new ArrayList<Observer>();    public void Follower(Observer observer);//增加关注者    public void haveNewDynamic(String message);//发送新的动态}/** * 关注者一 */class FollowerOne implements  Observer{    private Logger logger = LoggerFactory.getLogger(FollowerOne.class);    public void follower(Subjetct subjetct) {        subjetct.Follower(this);    }    public void receiveDynamic(String message) {        logger.info("关注者一收到了新的动态:"+message);    }}/** * 关注者二 */class FollowerTwo implements  Observer{    private Logger logger = LoggerFactory.getLogger(FollowerTwo.class);    public void follower(Subjetct subjetct) {        subjetct.Follower(this);    }    public void receiveDynamic(String message) {        logger.info("关注者二收到了新的动态:"+message);    }}/** * 主题实现 * 具体的一个对象 * 可以被关注,并且有新的动态会通知自己关注者 */class Followed implements  Subjetct{    private Logger logger = LoggerFactory.getLogger(Followed.class);    //private List<Observer> observerList = new ArrayList<Observer>();    public void Follower(Observer observer){        observerList.add(observer);    }    public void haveNewDynamic(String message){        logger.info("被关注着有新的动态:"+message);        for(Observer observer :observerList){            observer.receiveDynamic(message);        }    }}/***测试类,看输出效果**/class ObserverTest{     public static void main(String[] args) {        Subjetct subjetct = new Followed();        Observer followerone = new FollowerOne();        Observer followerTwo = new FollowerTwo();        followerone.follower(subjetct);        followerTwo.follower(subjetct);        subjetct.haveNewDynamic("我买了新的武器");    }}

类图

观察者模式

是否少了点什么

目前的实现,只能实现关注,但是如果关注者要取消关注呢?相信聪明的你是知道如何做的。(提供一点思路在主题接口,增加一个方法,能够从集合里移除关注者)

观察者模式

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。

要点

  • 观察者模式定义了对象之间一对多的关系
  • 主题(也就是可观察者)用一个共同接口来更新观察者
  • 观察者与可观察者之间用松耦合方式结合,可观察者不知道观察者的细节,只知道观察者实现了观察者接口
  • 有多个观察者时,不可以依赖特点的通知次序
  • swing大量使用观察者模式,许多GUI框架也是如此.