状态模式和策略模式的区别

状态模式

策略模式

两种模式的类图看起来很相似,但仔细对比可以发现,对于状态模式,具体状态类通常会持有上下文对象,这样状态类可以从上下文对象中获取必要的信息或与上下文进行交互,以根据上下文的状态执行相应的操作。同时,状态类甚至可以改变上下文的状态,比如上下文是一个快递信息类,初始状态是未发货,每次流转的时候执行打印当前物流信息,并把状态切换为下一个状态,比如已揽收、已发出等,这种情况下,上下文都不需要自己设定状态。也就是说状态类之间可以是相互了解的,因为大家都关联了上下文,每个状态类对于上下文的特定状态做出不同的行为。

而策略类则相对独立,每个策略只是提供一种算法,上下文只是执行具体的策略,它们之间只是单纯的调用关系,策略类并不服务于上下文,而只是客户端选择的一种策略而已,和状态最明显的区别就是它只提供策略,并不耦合任何上下文,也不会了解上下文的状态,因为它是独立的并不需要根据上下文的状态来提供不同的行为

使用上面也有所不同,策略模式通常只选择一种,因为实现的目的都是一样的,只是算法不同而已。而状态模式随着上下文的状态切换,每个状态类的方法都有可能被执行,因为不同的状态类定义的行为对应着上下文的不同状态。

总结一下区别

  1.  状态模式的状态可以存储上下文,策略类不关心上下文
  2. 状态模式的状态之间可以相互依赖,策略类之间相互独立
  3. 状态模式可以替换上下文中的状态(将上下文对象的状态this替换为其它状态),策略类不行
  4. 策略类处理单个特定的任务,状态类为上下文对象提供所有对应状态的实现
  5. 策略通常作为参数传递给上下文,状态可以由上下文自身创建

不过两者的思想都是差不多的,都是解耦客户端和具体实现,方便扩展,替换灵活,符合开闭原则

策略模式中的上下文你可能用错了-CSDN博客

  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值