设计模式-观察者模式、状态模式

目录

观察者模式

定义

类图

角色

优缺点

使用场景

状态模式

定义

类图

角色

优缺点

使用场景


观察者模式

定义

  • 定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新

  • 又被称为发布-订阅(Publish/Subscribe)模式,属于行为型模式的一种,它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己;

类图

角色

  • Subject :抽象主题(抽象被观察者),抽象主题角色把所有观察者对象保存在一个集合里,每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象

  • ConcreteSubject : 具体主题(具体被观察者),该角色将有关状态存入具体观察者对象,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知

  • Observer: 抽象观察者,是观察者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己

  • ConcrereObserver: 具体观察者,实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态

优缺点

  • 优点:

    • 实现了观察者和被观察者之间的抽象耦合

    • 动态联动

    • 广播通信。被观察者会向所有的登记的观察者发出通知

  • 缺点

    • 在应用观察者模式时需要考虑开发效率和运行效率的问题,程序中包括一个被观察者,多个观察者,开发,调式等内容会比较复杂。

使用场景

  • 关联行为场景,需要注意的是,关联行为是可拆分的,而不是"组合"关系

  • 事件多级触发场景

  • 跨系统的消息交换场景,如消息队列,事件总线的处理机制

状态模式

定义

  • 允许一个对象在其内部状态改变时改变它的行为,让对象看起来似乎修改了它的类

  • 与策略模式是亲兄弟,策略模式会控制对象使用什么策略,而状态模式会自动改变状态

类图

角色

  • state: 抽象状态对象,负责对象状态定义,并且封装环境角色来实现状态转换。一般为抽象类或者接口

  • ConcreteState: 具体状态角色,需要完成两个职责,本状态的行为管理和趋向状态管理,就是本状态下该干的事情,与本状态该如何过渡到其他状态

  • Context: 环境角色,定义客户端所需要的接口,并且负责具体状态的切换

优缺点

  • 优点

    • 封装了转换规则

    • 枚举可能的状态,在枚举状态之前需要确定状态种类

    • 将所有与某个状态有关的行为放到一个类中,并且可以以方便的增加新的状态,只需要改变对象状态即可改变对象的行为

    • 允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块

    • 可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数

  • 缺点

    • 状态模式的使用必然会增加系统类和对象的个数

    • 状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱

    • 状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需要修改对应类的源代码

使用场景

  • 行为随状态改变而改变的场景

  • 条件,分支语句的代替者

相关推荐
杯莫停丶1 小时前
设计模式之:外观模式
java·设计模式·外观模式
杯莫停丶2 小时前
设计模式之:命令模式
设计模式·命令模式·1024程序员节·活动勋章
电子科技圈4 小时前
芯科科技推出智能开发工具Simplicity Ecosystem软件开发套件开启物联网开发的新高度
mcu·物联网·设计模式·软件工程·软件构建·iot·1024程序员节
WaWaJie_Ngen5 小时前
【设计模式】组合模式(Composite)
设计模式·组合模式·1024程序员节
WaWaJie_Ngen7 小时前
【设计模式】装饰器模式(Decorator)
设计模式·装饰器模式
YuanlongWang7 小时前
C# 设计模式——观察者
windows·设计模式·c#
亿牛云爬虫专家7 小时前
中间件实现任务去重与精细化分发:设计模式与常见陷阱
设计模式·中间件·爬虫代理·数据抓取·商品信息·数据去重·电商搜索
顾漂亮13 小时前
Token快过期的三种续期方案
java·spring·状态模式
造价女工15 小时前
视频监控系统原理与计量
网络·音视频·状态模式·消防·工程造价
消失的旧时光-194319 小时前
kmp需要技能
android·设计模式·kotlin