Java的23种设计模式:观察者模式实战

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

观察者模式是一种行为型设计模式,又被称为发布/订阅模式,定义主题和观察者对象之间的一种一对多的依赖关系,当主题对象的状态发生变化时,会通知所有的观察者对象更新自身状态。

观察者模式是一种行为型设计模式,又被称为发布/订阅模式,定义主题和观察者对象之间的一种一对多的依赖关系,当主题对象的状态发生变化时,会通知所有的观察者对象更新自身状态。

详细介绍了观察者模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码和提供下载链接。

你将会获得以下知识:

  1. 观察者模式的完整代码
  2. 观察者模式的优缺点
  3. 观察者模式的使用场景

适合人群:Java中高级开发。



一、前言

在日常项目开发过程中,观察者模式是比较常用的模式之一,个人觉得运用它来设计当某个业务对象变化时需自动同步更新多个业务对象的业务场景,不但可以提升个人设计水平,而且还可以彰显个人技术魅力征服公司上级领导或者漂亮开发美眉。

本文详细介绍了观察者模式的代码分析、测试方法、优缺点、使用场景等,并贴出完整代码和提供下载链接。

二、概念介绍

  1. 抽象主题角色(Subject) 保存所有观察者的实例引用,定义操作观察者对象的相关方法(比如:添加观察者),定义通知所有观察者的抽象方法(即发布消息)。
  2. 具体主题角色(ConcreteSubject) 继承抽象主题类并重写其通知方法,当具体主题发生变化时通知所有观察者做相应处理。
  3. 抽象观察者角色(Observer) 通常是一个接口,定义相关方法给具体主题发生变化时调用
  4. 具体观察者角色(ConcreteObserver) 实现抽象观察者定义的相关方法,实现在收到通知后执行自身的业务逻辑(即消费消息)各个组件之间的关系图如下: 在这里插入图片描述

三、代码分析

  1. 代码结构 在这里插入图片描述
  2. 观察者模式 下面是拿汽油价格变动作为例子进行讲解和编码,汽油价格是经常变化的,有时下跌有时上涨,下跌时小车车主和货车车主可以省下不少油钱,上涨时则需付更多油钱。首先创建一个抽象观察者角色车主接口,定义一个通用的方法给各种类型车主(即具体观察者)去实现,代码如下:
    /** * 抽象观察者角色,车主 */public interface Owner {    void response(boolean flag);}

    其次创建两个具体观察者类角色,分别是小车车主类和货车车主类,都实现各自的响应处理(即消费消息),代码如下:

    /** * 具体观察者角色,小车车主 */public class CarOwner implements Owner {
    @Overridepublic void response(boolean flag) {    if(flag){        System.out.println(\"油价下跌,小车车主们乐开怀\");    }else{        System.out.println(\"油价上涨,小车车主们好伤心\");    }}
    } /** * 具体观察者角色,货车车主 */ public class TruckOwner implements Owner {
    @Overridepublic void response(boolean flag) {    if(flag){        System.out.println(\"油价下铁,货车车主们乐开怀\");    }else{        System.out.println(\"油价上涨,货车车主们好伤心\");    }}
    } 

    再创建一个抽象主题角色油价抽象类,它持有所有观察者的实例引用,并定义添加和删除观察者的方法,定义一个油价发生改变抽象方法(即发布消息)让子类(即具体主题)去通知所有观察者,代码如下:

    /** * 抽象主题角色,油价 */public abstract class OilPrice {    //所有观察者    protected List<Owner> ownerList = new ArrayList<>();
    /** * 添加观察者 */public void add(Owner owner) {    ownerList.add(owner);}/** * 删除观察者 * @param owner */public void remove(Owner owner) {    ownerList.remove(owner);}/** * 发布消息 * @param flag true:油价下铁,false:油价上涨 */public abstract void change(boolean flag);
    } 

    最后创建一个具体主题角色汽油价格类,它继承了油价抽象类并重写了油价发生改变方法,在方法中遍历所有观察者执行相应的方法,代码如下:

    /** * 具体主题角色,汽油价格 */public class GasolinePrice extends OilPrice {
    @Overridepublic void change(boolean flag) {    System.out.println(\"汽油价格发生了改变\");    for (Owner owner : ownerList) {            owner.response(flag);    }}
    } 

    观察者模式测试代码如下:

    public class TestForObserver {
    public static void main(String[] args) {    //汽油    OilPrice gasoline = new GasolinePrice();    //小车车主    Owner carOwner = new CarOwner();    //货车车主    Owner truckOwner = new TruckOwner();    //添加观察者(小车车主和货车车主)    gasoline.add(carOwner);    gasoline.add(truckOwner);    //油价上涨    gasoline.change(true);    System.out.println(\"============================\");    //油价下铁    gasoline.change(false);}
    } 

四、代码测试

  • 观察者模式,运行TestForObserver类中的main方法 控制台日志: 汽油价格发生了改变 油价下跌,小车车主们乐开怀 油价下铁,货车车主们乐开怀 ============================ 汽油价格发生了改变 油价上涨,小车车主们好伤心 油价上涨,货车车主们好伤心 在这里插入图片描述

五、优缺点

优点:

  • 解耦,降低了主题与观察者两者之间的耦合关系
  • 符合依赖倒置原则,上层模块(抽象主题和抽象观察者)不依赖下层模块(具体主题和具体观察者)
  • 实现了一套触发机制,功能类似于Spring事件监听机制、消息队列

缺点:

  • 抽象主题容易出现循环引用而导致系统崩溃,使用时要特别注意
  • 观察者对象太多情况下,需花更多时间去通知所有观察者而导致降低系统性能

六、使用场景

  1. 当某个业务对象发生变化时,需要自动同步更新一系列其他业务对象。
  2. 微博订阅功能,博主发布新消息后所有订阅者都能收到这条消息。
  3. Spring中的事件监听机制Event

七、总结

通过这次的观察者模式实战,让我们掌握了观察者设计模式是什么、代码如何编写及测试、优缺点及使用场景。

观察者模式实战完整代码已上传到 Gitee,下载地址如下:https://gitee.com/romantic-pk/demo-observer.git

PS:如有写错请指正,感谢您的阅读。

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。