zoukankan      html  css  js  c++  java
  • 观察者模式

     读完 《HeadFirst 设计模式》后,我谈谈自己的理解,如果觉得不对的话,欢迎您的批评!

    如果该模式是一对多的话,那么为什么通知者要实现一个接口呢?

    我的理解是这样的:实现了这个接口的就是通知者,只是起了一种概念的作用,对程序并没有实际影响!

    既然没有实际什么影响,那为什么不是继承一个抽象类呢?抽象类也可以起到类似的作用啊?

    我想:从概念("一")来讲的话,抽象类更多的是继承概念(也就是"多"),所以并没有接口合适。

          其次,因为它是抽象类,所以继承它的类不能在继承别的类,这很不方便。

    那为什么观察者是实现一个接口,而不是实现一个抽象类呢?

    这个和上一篇文章一样:可能存在多个观者者的更新方法是相同的,如果用接口的话就能避免写重复的代码。

    我们可以把观察者的不变的部分放在一个基类里面,然后继承该类,再实现接口。这样就就完美解决了问题。

    那么如果该模式是多对多的话呢,通知者该用接口还是用抽象类?

    众所周知:通知类一般包含这几个方法(addObserver,deleteObserver,notifyOberver)

    如果方法是多变的话,你会发现其实不管是用接口还是抽象类,都有可能写重复的代码。

    因为你可能希望添加观察者的同时干点什么事(A),或者删除观察者的同时干点另外的事(B)。

    总有一些观察者会处于(A,C),或者(D,B) 这种情况。所以这时用抽象类还是接口没什么区别。

    不过用接口有一个优点,就是实现接口的同时可以继承一个类。

    你可能会想,那我不如把那几个方法都拆开变成接口,这样不就没问题了吗?

    如果你这么想,确实没有问题,但是确不太让人容易理解,那几个方法从意义上来说应该是一体的。

    如果你不嫌麻烦的话的确可以这么做,但是代码阅读起来就会比较困难了。

    那么如果方法是不变的呢,你可能会想,既然方法不会变,那我不如用类好了。

    Java 内置的观察者模式就是这样的,这意味着你在继承该类的同时,不用再写那几个方法了。

    但是同样他也带来一些问题,你不能决定那几个方法的细节部分,继承该类的同时你不能继承其他类。

    欢迎各位指正,谢谢!

  • 相关阅读:
    Postman----Presets(预先设置)的使用
    Postman-----Response body:JSON value check的使用介绍
    Linux下的eclipse的安装
    update-alternatives --Install
    linux配置java环境变量(详细)
    ubuntu: 终端全屏快捷键
    Linux/Unix中的命令提示符prompt
    Linux查看系统信息的一些命令及查看已安装软件包的命令(转)
    第一课、OpenGL绘制直线等等
    Depth Buffer
  • 原文地址:https://www.cnblogs.com/M-Anonymous/p/13175768.html
Copyright © 2011-2022 走看看