
正文
java代码实现状态模式 java代码实现状态模式是什么
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
Java中,状态模式和策略模式的区别
策略模式通过封装一组相关算法,为Client提供运行时的灵活性。Client可以在运行时,选择任一算法,而不改变使用算法的Context。一些流行的策略模式的例子是写那些使用算法的代码,例如加密算法、压缩算法、排序算法。另一方面,状态模式允许对象,在不同的状态拥有不同的行为。因为现实世界中的对象通常都是有状态的,所以在不同状态,行为也不一样。例如,VM(自动售货机)只在hasCoin状态才给吐商品;不投币,是不会吐的。现在可以清楚的看出不同之处了:意图是不同的。状态模式帮助对象管理状态,而策略模式允许Client选择不同的行为。
另一个不那么容易能看出来的区别是:是谁促使了行为的改变。策略模式中,是Client提供了不同的策略给Context;状态模式中,状态转移由Context或State管理。另外,如果在State中管理状态转移,那么必须持有Context的引用。例如,在VM的例子中,State对象需要调用VM的setState()方法去改变的状态。另一方面,Strategy从不持有Context的引用,是Client把所选择的Strategy传递给Context。由于状态模式和策略模式的区别,是流行的Java设计原则类面试题之一,将会在本文探讨在Java中,状态模式和策略模式的异同,这可以加深理解。
(1)相似之处
看看状态模式和策略模式的UML图,就会发现结构非常相似。使用State对象改变自己行为的对象被称为Context对象;相似的,使用Strategy对象改变自己行为的对象叫Context对象。记住,Client和Context打交道。在状态模式中,Context把方法调用委托给当前的状态对象,而在策略模式中,Context使用的Strategy对象,是被当做参数传递过来的,或在Context对象被创建时就被提供的。
这是专为经典的VM问题而设计的状态模式UML类图。可以看出,VM的状态是个接口,表示不同状态的具体实现。每一个状态都持有Context的引用,用来管理由Context触发的行为导致的状态转移。
这是专为实现排序功能而设计的策略模式UML类图。因为存在很多排序算法,该模式让Client在排序时选择适当的算法。事实上,Java的集合框架就使用这个模式,实现了用来排序的Collections.sort()方法。不同的是,不允许Client选择排序算法,而是让传递Comparator或Comparable接口的实例来指定比较策略。
(2)不同之处
策略模式封装了一组相关算法,允许Client在运行时使用可互换的行为;状态模式帮助一个类在不同的状态显示不同的行为。
状态模式封装了对象的状态,而策略模式封装算法或策略。因为状态是跟对象密切相关的,不能被重用;而通过从Context中分离出策略或算法,可以重用。
在状态模式中,每个状态通过持有Context的引用,来实现状态转移;但是每个策略都不持有Context的引用,只是被Context使用。
策略实现可以作为参数传递给使用的对象,例如Collections.sort(),参数包含一个Comparator策略。另一方面,状态是Context对象自己的一部分,随着时间的推移,Context对象从一个状态转移到另一个状态。
虽然都符合OCP原则,策略模式也符合SRP原则(单一职责原则),因为每个策略都封装自己的算法,且不依赖其他策略。一个策略的改变,并不会导致其他策略的变化。
另一个理论上的不同:策略模式定义了对象“怎么做”的部分。例如,排序对象怎么对数据排序。状态模式定义了对象“是什么”和“什么时候做”的部分。例如,对象处于什么状态,什么时候处在某个特定的状态。
状态模式中很好的定义了状态转移的次序;而策略模式并无此需要:Client可以自由的选择任何策略。
一些常见的策略模式的例子是封装算法,例如排序算法,加密算法或者压缩算法。如果看到代码需要使用不同类型的相关算法,那么考虑使用策略模式吧。而识别何时使用状态模式是很简单的:如果需要管理状态和状态转移,但不想使用大量嵌套的条件语句,那么就是了。
最后但最重要的一个不同之处是,策略的改变由Client完成;而状态的改变,由Context或状态自己。
相关问答
Q1: java 语言。要求使用状态模式模拟点灯开关切换的过程。跪求指教!
第一个变量,当你触发事件时改变这个变量的值,然后通过这个值来判断灯的开关.
比如说你定义一个i=0,当=0时灯是关的,然后你触发事件调用函数,改变i=1,在判断灯中的i的值.
Q2: JAVA+项目流程中状态多,如何设计便于维护?
在Java项目流程中java代码实现状态模式,状态多确实会增加项目java代码实现状态模式的维护难度。为java代码实现状态模式了便于维护,可以考虑以下设计方案java代码实现状态模式:
统一状态管理:将所有状态统一管理,可以使用一个枚举类型或者常量类来管理所有状态。这样可以避免出现各自为政java代码实现状态模式的情况。
使用状态机模式:状态机模式是一种将状态转换及其对应的操作封装成一个状态机的设计模式。在Java中可以通过使用状态机框架或自己实现状态机模式来处理多状态的问题。
使用设计模式:可以使用一些设计模式来处理状态多的问题,如状态模式、策略模式、命令模式等。这些模式可以帮助我们在多状态的情况下实现代码解耦和模块化。
划分模块:在设计项目时,可以将多状态的模块单独划分出来,形成一个独立的模块。这样可以降低代码的复杂度,并且可以更加方便地维护和修改。
统一命名规范:在Java项目中,对于状态的命名规范要统一,避免出现不同的命名方式造成混乱。同时,应该为每个状态提供详细的注释和文档,方便后续的维护和修改。
综上所述,设计Java项目时需要考虑到状态多的情况,通过统一状态管理、使用状态机模式、使用设计模式、划分模块、统一命名规范等方案来处理多状态的问题,可以降低维护难度,提高代码质量。
java代码实现状态模式的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于java代码实现状态模式是什么、java代码实现状态模式的信息别忘了在本站进行查找喔。






