`
guanjh
  • 浏览: 232848 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

State模式与Strategy模式的区别

    博客分类:
  • Java
阅读更多
    策略用来处理算法方式变化,而状态则是处理状态变化。
    对于模式的选择反映出你对结构的想法。此刻你把它视为一种状态,如果将来你发觉用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模式提供了一种用多个行为中的一个行为来配置一个类的方法, 使得算法可独立于使用它的客户而变化。
如果光看这两个模式的结构是非常象的,但是它们的问题域还是不同的。
如果理解它的设计思想,那么其实不必在意到底是使用了什么模式。
分享到:
评论
1 楼 prothi 2009-12-04  
受教了,谢谢~

相关推荐

    Java设计模式 设计模式介绍

    2、爪哇语言抽象工厂创立性模式介绍 3、工厂方法创立性模式介绍 4、单态创立性模式介绍 5、单态创立性模式介绍 6、观察者模式介绍7、责任链模式 8、设计模式之Observer 9、设计模式之Strategy(策略) 10、设计模式之...

    JAVA设计模式chm文档

    创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder 设计模式之Singleton(单态) ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    JAVA设计模式之行为模式

    这是JAVA设计模式中属于行为模式的部分,包括Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Strategy(策略模式)、State 、Observer(观察者模式)、Visitor...

    24种设计模式以及混合设计模式

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、命令模式(Command)、迭代器模式(Iterator)、访问者模式(Visitor)、备忘录模式(Memento)、状态模式(State)、职责链...

    C#设计模式_设计模式_C#_

    创建型: 1. 单件模式(Singleton Pattern) 2. 抽象工厂(Abstract Factory) 3. 建造者模式(Builder) 4.... 策略模式(Strategy Pattern) 22. 访问者模式(Visitor Pattern) 23. 状态模式(State Pattern)

    软件设计模式与体系结构孙云山课后习题234章答案.zip

    孙云山老师的“软件设计模式与体系结构”课程深入探讨了这些模式及其在构建复杂系统中的应用。本资料集合包含了课后习题的第234章答案,这将有助于学生深化对设计模式的理解,并提升其实际应用能力。 设计模式是...

    java设计模式教程+源代码

    AbstractFactory ( 抽象工厂 ) FactoryMethod ( 工厂方法 ) Singleton ( 单态模式 ) Builder ( 建造者模式 ) ...Strategy ( 策略模式 ) TemplateMethod ( 模板方法 ) Visitor ( 访问者模式 )

    C#版 24种设计模式

    备忘录模式(Memento Pattern) 策略模式(Strategy Pattern) 抽象工厂模式(Abstract Factory Pattern) 代理模式(Proxy Pattern) 单例模式(Singleton Pattern) 迭代器模式(Iterator Pattern) 访问者模式(Visitor ...

    设计模式文档 chm

    设计模式参考文档 创建模式: 设计模式之Factory 设计模式之Prototype(原型) 设计模式之Builder ...设计模式之Strategy(策略) 设计模式之Mediator(中介者) 设计模式之Interpreter(解释器) 设计模式之Visitor

    C++设计模式(Design Pattern)范例源代码

    23种设计模式(Design Pattern)的C++实现范例,包括下面列出的各种模式,代码包含较详细注释。另外附上“设计模式迷你手册.chm” ...策略模式(Strategy) 模板方法模式(Template Method) 访问者模式(Visitor)

    设计模式那点事

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、备忘录模式(Memento)、观察者模式(Observer)、状态模式(State)、策略模式(Strategy...

    设计模式与重构(design pattern )

    如策略模式(Strategy)、模板方法模式(Template Method)、观察者模式(Observer)、迭代器模式(Iterator)、命令模式(Command)、责任链模式(Chain of Responsibility)、备忘录模式(Memento)、状态模式...

    c#设计模式

    包括责任链模式(Chain of Responsibility)、命令模式(Command)、解释器模式(Interpreter)、迭代器模式(Iterator)、...State)、策略模式(Strategy)、模板方法模式(Template Method)和访问者模式(Visitor)...

    23种java设计模式.pdf

    包括 Iterator(迭代模式)、Template(模板模式)、Chain of Responsibility(责任链模式)、Memento(纪念品模式)、Mediator(中介模式)、Interpreter(解释器模式)、Strategy(策略模式)、State(状态模式)...

    C#面向对象设计模式纵横谈(视频与源码)

    C#面向对象设计模式纵横谈(1):面向对象设计模式与原则 C#面向对象设计模式纵横谈(2):Singleton 单件(创建型模式) C#面向对象设计模式纵横谈(3):Abstract Factory 抽象工厂模式(创建型模式) C#面向对象设计...

    用Java实现23种设计模式

    策略模式(Strategy Pattern) 模板模式(Template Pattern) 访问者模式(Visitor Pattern) 4. J2EE 模式 MVC 模式(MVC Pattern) 业务代表模式(Business Delegate Pattern) 数据访问对象模式(Dao ...

    23种面向对象设计模式

    包括策略模式(Strategy)、模板方法模式(Template Method)、迭代器模式(Iterator)、观察者模式(Observer)、访问者模式(Visitor)、命令模式(Command)、备忘录模式(Memento)、状态模式(State)、解释器...

    《java设计模式》课后习题模拟试题解答——刘伟.zip

    3. **模式间的相互关系**:了解不同设计模式之间的关联和区别,比如装饰器和代理模式的区别,或者单例模式与静态内部类的实现差异。 4. **模式的优缺点**:评估每种模式的适用性和潜在问题,如过度设计或性能影响。 ...

    研磨设计模式(完整带书签).part2.pdf

    第17章 策略模式(Strategy) 第18章 状态模式(State) 第19章 备忘录模式(Memento) 第20章 享元模式(Flyweight) 第21章 解释器模式(Interpreter) 第22章 装饰模式(Decorator) 第23章 职责链模式...

    敏捷软件开发:原则、模式与实践

    第14章 TEMPLATE METHOD模式和STRATEGY模式:继承与委托 第15章 FACADE模式和MEDIATOR模式 第16章 SINGLETON模式和MONOSTATE模式 第17章 NULL OBJECT模式 第18章 薪水支付案例研究:第一次迭代开始 第19章 薪水支付...

Global site tag (gtag.js) - Google Analytics