状态模式和策略模式比较

说到策略模式,我们最先想到的就是商店的收银方式:不满100,正常收费;超过100不满300,超过的部分打八折;超过300,全价九折!

解决这个问题最最普通的方法就是大量的If…Else…,而它带来的就是无情的难以维护,每次条件变更都会修改原代码,严重违反了开闭原则。

显而易见,策略模式的解决方式就是封装了一系列平行且复杂的实现方式,在不同的场景下,我们选择一个最适合的方案。

来看它的类图

图-1     《大话设计模式》 
                                                            

图-2     《HeadFirst》

第一张是《大话设计模式》里的,第二张是《HeadFirst》里的一个具体的例子。

第一个比较简单,也最典型。不过多说了。

来看第二个,它其实是经过了一系列演变的。原来的“飞行”接口是封装在Duck里的,也就是说所有的鸭子都必须会飞才行。但实际上有的鸭子只能跑,那怎么办?就只能把“飞行”抽取出来,形成一个单独的接口,让会飞的鸭子去实现。

这样还有问题,如果有的鸭子能直接飞,有的鸭子需要助跑飞,那怎么办?每个类型的鸭子都需要重写飞行方法,这样也不合适,所以就写出“飞行”接口实现的子类,再让符合该类型的鸭子去调用。实质就是一种多态。

策略就体现在它封装了不同的飞行方式,可供客户端去选择一个最好的、最合适的去调用。

状态模式:当一个对象的内在状态变化时允许改变起行为,这个对象看起来像是改变了其类。

来看它的类图:

状态模式主要突出了两个字:“改变”,对象的状态决定了状态的行为,我们精神亢奋的时候,就努力的工作,努力的工作就导致了我们身心疲惫,身心疲惫就导致我们的行为是需要休息。从这里我们可以看出,事物的内在状态决定了事物所做出的行为,而事物的行为又会改变我们事物的状态,两者在不断的相互影响,然后实现状态的转换。

状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂的情况。把状态的判断转移到表示不同状态的一系列类中,可以把复杂判断简化。

当一个状态的行为取决于他的状态,并且他必须在运行时刻根据状态改变他的行为时,可以考虑使用状态模式。

比较:从上面这几点,我们可以看出策略模式和状态模式的应用场景有很大的不同:一个是封装一系列平行且复杂多变的实现方式,一个是实现把对象的内在状态的变化封装起来,用外部行为来表现出来。

总之,虽然二者的类图很相似,但实际上解决的是不同情况的两种场景问题,需要我们去实际分析和判断。不同设计模式之间存在不同的设计思路,相似的更需要我们去仔细比较,每次学习都是一次进步和再认识。

时间: 2024-11-02 22:35:21

状态模式和策略模式比较的相关文章

孪生兄弟状态模式与策略模式有什么区别,究竟该如何选择

都说状态模式和策略模式很像,它们的 UML 类图一样.这也说明,单纯从代码角度来讲,它们的本质一样,其实都是多态的应用.但它们实际所代表的的事物特征是有本质区别的,选择哪个设计模式,代表了你看待业务场景的角度.从合理角度地对业务进程抽象,选择恰当的设计模式,才能让代码有更好的结构. 这篇文章重点说说我对状态模式和策略模式区别的理解,以及如何选择. 一.策略模式 关于策略模式,我之前写过一篇笔记,不过是 C# 写的.策略模式解决了代码逻辑分支较多,对不同的分支,采取不同措施的问题.不熟悉策略模式的

状态模式和策略模式区别

学完策略模式和状态模式后,对比发现两者的关系类图几乎一样,遂产生了疑问,这两者模式几乎一样的设计,那他两有什么区别吗 不过既然是两者设计模式,那他们肯定不一样了,哪怕是失散多年的孪生兄弟,那也只是同表不同里 下面结合书上和网上的博客记录下我的理解 策略模式类图: 状态模式类图: 策略模式:其思想是针对一组算法,将每一种算法都封装到具有共同接口的独立的类中,从而是它们可以相互替换.策略模式的最大特点是使得算法可以在不影响客户端的情况下发生变化,从而改变不同的功能 状态模式:允许一个对象在其内部状态

设计模式之桥梁模式和策略模式的区别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个例子: 策略模式:我要画圆,要实心圆,我可以用solidPen来配置,画虚线圆可以用dashedPen来配置.这是strategy模式. 桥接模式:同样是画圆,我是在windows下来画实心圆,就用windowPen+solidPen来配置,在unix下画实心圆就用uni

从桥接模式与策略模式谈起(转载)

原文地址:http://www.blogjava.net/wangle/archive/2007/04/25/113545.html 从桥接模式与策略模式谈起 桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.以下是它们的UML结构图. 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 在策略模式中,Context也使用聚合的方式引用Startegy抽象接口. 从他们的结构图可知,在这两种模式中,都存在一个对象使用聚合的方式引

命令模式与策略模式之己见

以前项目写过关于TR069协议报文处理的代码(主要是基于SOAP协议发送一些远程命令并处理响应),在设计的时候,想的是应用策略模式对报文进行解析处理, 下图是主要代码结构(和策略模式很像) 代码类似于: /** * 1.需要解析的XML */ String xml = "<xml>...</xml>"; /** * 2.获取xml类型 */ MessageType type = SoapMessageFactory.getRpcType(xml); /** *

Android设计模式之命令模式、策略模式、模板方法模式

命令模式是其它很多行为型模式的基础模式.策略模式是命令模式的一个特例,而策略模式又和模板方法模式都是算法替换的实现,只不过替换的方式不同.下面来谈谈这三个模式. 命令模式 将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化:对请求排队或记录请求日志,以及支持可撤消的操作. java中传递(注入)对象很容易,但是却不支持直接传递行为(即传递函数或者说传递方法),只能间接的通过传递(注入)一个对象,再调用它的行为来实现.如果把这样的行为抽取出来为一个类,称作命令类,它的具体实现都是命令

设计模式之桥梁模式和策略模式的差别

桥接(Bridge)模式是结构型模式的一种,而策略(strategy)模式则属于行为模式.下面是它们的UML结构图. 桥梁模式: 策略模式: 在桥接模式中,Abstraction通过聚合的方式引用Implementor. 举一个样例: 策略模式:我要画圆.要实心圆,我能够用solidPen来配置.画虚线圆能够用dashedPen来配置. 这是strategy模式. 桥接模式:相同是画圆,我是在windows下来画实心圆.就用windowPen+solidPen来配置.在unix下画实心圆就用un

编程学习之简单工厂模式与策略模式

很久之前在学习c++的时候就听到老师说写代码要考虑重构,架构,在此期间学习到了一种简单工厂模式. 何为简单工厂模式呢?简单工厂模式又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类. 举个栗子,我们可能会遇到这类问题,假如需要一个软件,它可以计算各种图形的面积,使用简单工厂模式来构架的话就是通过创建一个工厂类,而程序运行过程中这些实例化这些具体的计算面积的算法类,然后主程序通过调用这些实例

19行为型模式之策略模式

概念 Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).Strategy模式主要用来平滑地处理算法的切换 . 角色和职责 Strategy: 策略(算法)抽象. ConcreteStrategy 各种策略(算法)的具体实现. Context 策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定. 适用于:       

委派模式和策略模式

一.委派模式 委派模式(Delegate Pattern):指负责任务的调度和分配任务,跟代理模式很像,可以看做是一种特殊情况下的静态代理的全权代理,但是代理模式注重过程,而委派模式注重结果.(属于行为型模式,但它不属于GOF的23种设计模式之一.类名以Delegate和Dispatcher结尾的一般都是委派模式) 委派模式在Spring中应用非常多,大家常用的DispatcherServlet其实就用到了委派模式.现实生活中也常有委派的场景发生,例如:老板(Boss)给项目经理(Leader)