当前位置: 首页 > article >正文

c#代码介绍23种设计模式_19状态者模式

目录

1、状态者模式的介绍

2、状态者模式的定义

3、状态者模式的结构

4、状态者模式涉及角色

5、状态者模式的实现

6、应用状态者模式完善中介者模式方案

7、状态者模式的应用场景

8、状态者模式的优缺点

9、实施思路


在上一篇文章介绍到可以使用状态者模式和观察者模式来解决中介者模式存在的问题,在本文中将首先通过一个银行账户的例子来解释状态者模式,通过这个例子使大家可以对状态者模式有一个清楚的认识,接着,再使用状态者模式来解决上一篇文章中提出的问题

1、状态者模式的介绍

每个对象都有其对应的状态,而每个状态又对应一些相应的行为,如果某个对象有多个状态时,那么就会对应很多的行为。那么对这些状态的判断和根据状态完成的行为,就会导致多重条件语句,并且如果添加一种新的状态时,需要更改之前现有的代码。
这样的设计显然违背了开闭原则。状态模式正是用来解决这样的问题的。状态模式将每种状态对应的行为抽象出来成为单独新的对象,这样状态的变化不再依赖于对象内部的行为

2、状态者模式的定义

状态模式——允许一个对象在其内部状态改变时自动改变其行为,对象看起来就像是改变了它的类(状态得类SilveStater(没利息)、GoldState(有利息)和RedState(赤字))

3、状态者模式的结构

既然状态者模式是对已有对象的状态进行抽象,则自然就有抽象状态者类和具体状态者类,而原来已有对象需要保存抽象状态者类的引用,
通过调用抽象状态者的行为来改变已有对象的行为。经过上面的分析,状态者模式的结构图也就很容易理解了

4、状态者模式涉及角色

Account类:维护一个State类的一个实例,该实例标识着当前对象的状态。
State类:抽象状态类,定义了一个具体状态类需要实现的行为约定。
SilveStater、GoldState和RedState类:具体状态类,实现抽象状态类的每个行为

5、状态者模式的实现

就以银行账户的状态来实现下状态者模式。银行账户根据余额可分为RedState、SilverState和GoldState。这些状态分别代表透支账号,新开账户和标准账户。
账号余额在【-100.0,0.0】范围表示处于RedState状态,账号余额在【0.0 , 1000.0】范围表示处于SilverState,账号在【1000.0, 100000.0】范围表示处于GoldState状态。
通过实现可以看出来,进行存取款交易,会影响到Account内部的状态,由于状态的改变,从而影响到Account类行为的改变,而且这些操作都是发生在运行时的。

State抽象类中引用Account,并且有存款,取款,取利息得方法 => Account类引用State,并且也有存款,取款,取利息得方法,只是调用State得方法
=> SilveStater、GoldState和RedState对State的实现类,一定实现了存款,取款,取利息得方法(具体钱加减处理的位置),只是每个操作后,根据余额判断账户所属的状态,转换到SilveStater、GoldState还是RedState

6、应用状态者模式完善中介者模式方案

和中介者模式相比,抽象牌友类(AbstractCardPartner)的ChangeCount方法不需要,因为具体的钱的改变移到各个状态的实现类中(AWinState, BWinState)


http://www.kler.cn/news/335106.html

相关文章:

  • 【WPF开发】超级详细的“文件选择”(附带示例工程)
  • 华为手机连接蓝牙音响后播放声音小的问题分析
  • RCE+[伪协议综合]
  • 图像转3D视差视频:DepthFlow
  • Linux Cent7 已安装MySQL5.7.X,再安装MYSQL8.4.2
  • 视频加字幕免费软件哪个好用?详细介绍6款字幕编辑软件的优缺点!码住!
  • 网络威胁情报技术的进步
  • Watchdog Timers(WDT)
  • 【鼠鼠学AI代码合集#7】概率
  • Ubuntu换源
  • [Leetcode LCR188.][Medium]-买卖芯片的最佳时机-dp/状态压缩
  • 文件后缀名不见了怎么办?
  • 【微服务】服务调用 - OpenFeign(day6)
  • linux启用 IPv4 转发
  • 物理学基础精解【56】
  • 每日一练:最长湍流子数组
  • Lustre v6 介绍
  • 力扣10.6
  • AI赋能,旅游新纪元,看旅游大厂携程的AI实践
  • D28【python 接口自动化学习】- python基础之输入输出与文件操作