State模式与Strategy模式的区别

    策略用来处理算法方式变化,而状态则是处理状态变化。
    对于模式的选择反映出你对结构的想法。此刻你把它视为一种状态,如果将来你发觉用Strategy能更好的说明你的意图,你可以重构它。这两种模式在结构上是相似,都是通过继承来实现的。所以如果重构变化会很小的。这两种模式之间有时候没有区别,譬如在面向连结的TCPConnection例子中,不同的状态可能具有不同的方法。但是在刚刚实现的一个无连结的P2P底层协议中,所有状态需要处理地就是一个processXML方法,这时候,你可以叫它状态或者策略都可以。
    Strategy模式用来处理用户算法方案的变化。Strategy适合下列场合:
           1.以不同的格式保存文件;
           2.以不同的算法压缩文件;
           3.以不同的算法截获图象;
           4.以不同的格式输出同样数据的图形,比如曲线 或框图bar等,
这些算法方案之间一般来说没有状态变迁,并且你总是从几个算法中间选取一个。
    Strategy最经典的用法是和observe一起组成MVC,其中V通过Observe观察M,而V通过strategy控制C.
    Strategy使用的另一个最频繁的地方就是消除大量的Case或if else ,但是条件是这些case中每个条件可以归纳为一个算法,最好它们只需要相同的参数。
对这些case,if else使得strategy有了一个policy的别名,还有一个常用的地方叫做validator,譬如在输入框内进行检查时可以把它实现为Validator。有时候,if else的嵌套层次可能很深,这时候策略可能不能用,那么你可能需要更加复杂或者更加专注的Rule模式。
    State模式则有所不同,她实现的一个概念可以叫做动态继承,也就是继承的子类(每一个状态)可以发生变化。这些状态的变化是一个整体,组成了一个状态变化图。而一般来说,使用该模式的状态之间存在着一种线性变化的关系,也就是一个状态变为另一个,然后是第三个。这样做的好处是在组成你整个变化过程中某些状态之间需要插入一个新的状态,或者状态的顺序之间发生变化,对客户是不可见。在处于不同的状态时,客户代码可以执行的方法也是不同的。但它的问题就是必须在Context和所有的状态实现所有状态可能的方法。
 
----------------------------------------------------------------------------------------------------------------------------------------------------------------
对于State:
意图:允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
适用性:
一个对象的行为取决于它的状态, 并且它必须在运行时刻根据状态改变它的行为。
一个操作中含有庞大的多分支的条件语句,且这些分支依赖于该对象的状态。这个状态通常用一个或多个枚举常量表示。通常, 有多个操作包含这一相同的条件结构。S t a t e模式将每一个条件分支放入一个独立的类中。这使得你可以根据对象自身的情况将对象的状态作为一个对象,这一对象可以不依赖于其他对象而独立变化。
它关注对象的状态,比如对于一个CONNECTION,它有已连接、已关闭以及正在连接等状态,不同的状态对其行为有决定性作用,通过STATE模式,可以通过替换不同状态对象来改变CONNECTION的行为,即,如果一个问题,它强调由对象状态决定行为,那么可以考虑这个模式。
对于STRATEGY:
意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
适用性:
许多相关的类仅仅是行为有异。“策略”提供了一种用多个行为中的一个行为来配置一个类的方法。
需要使用一个算法的不同变体。例如,你可能会定义一些反映不同的空间/时间权衡的算法。当这些变体实现为一个算法的类层次时[ H O 8 7 ] ,可以使用策略模式。
算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构。
一个类定义了多种行为, 并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的S t r a t e g y 类中以代替这些条件语句。 
这个模式关注对象行为,它使对象的行为可以被动态配置(某种意义上说和STATE是很像),特别是最后一个适用性,它将相关条件分支移入各自的STRATEGY类中以代替这些条件语句

综上所述,
STATE模式在对象内部状态改变时重新配置它的行为,
STRATEGY模式提供了一种用多个行为中的一个行为来配置一个类的方法, 使得算法可独立于使用它的客户而变化。
如果光看这两个模式的结构是非常象的,但是它们的问题域还是不同的。
如果理解它的设计思想,那么其实不必在意到底是使用了什么模式。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值