设计模式--观察者模式

#观察者模式

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

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

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

订阅报纸流程图

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

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

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

###现实生活中的更多场景

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

。。。。。

###观察者模式
小张带着自己的思考,向经验丰富的老王求教。

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


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

老王:小张啊,师傅领进门,修行看个人,既然你已经知道了需要用观察者模式来实现这个需求,那么就要利用网络的资源,去进行学习。
我们程序员需要学的东西很多,往往别人只能给你点拨一下,具体的了解还是要靠 百度谷歌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("我买了新的武器");

    }
}

###类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-shAJecnW-1596105605336)(https://github.com/longjiangxue/blogImage/blob/master/%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F.png?raw=true)]

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

##观察者模式

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

###要点

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值