模式定义:
允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。
模式结构
模式结构代码实现
public interface State {
public void handle();
}
public class FreeRoom implements State {
public void handle() {
System.out.println("房子空闲可以入住");
}
}
public class BookedRoom implements State {
public void handle() {
System.out.println("房子预定完,没地住了");
}
}
public class RoomContext {
public void setState(State state) {
System.out.println("改变状态");
state.handle();
}
}
public class Client {
public static void main(String[] args) {
FreeRoom freeRoom = new FreeRoom();
BookedRoom bookedRoom = new BookedRoom();
freeRoom.handle();
RoomContext context = new RoomContext();
context.setState(bookedRoom);
}
}
模式的优缺点
模式的优点
-
简化应用逻辑控制
状态模式使用单独的类来封装一个状态的处理。如果把一个大的程序控制分成很多小块,每块定义一个状态来代表,那么就可以把这些逻辑控制的代码分散到很多单独的状态类当中去,这样就把着眼点从执行状态提高到整个对象的状态,使得代码结构化和意图更清晰,从而简化应用的逻辑控制。对于依赖于状态的if-else,理论上来讲,也可以改变成应用状态模式来实现,把每个if或else块定义一个状态来代表,那么就可以把块内的功能代码移动到状态处理类去了,从而减少if-else,避免出现巨大的条件语句。 -
更好的分离状态和行为
状态模式通过设置所有状态类的公共接口,把状态和状态对应的行为分离开来,把所有与一个特定的状态相关的行为都放入一个对象中,使得应用程序在控制的时候,只需要关心状态的切换,而不用关心这个状态对应的真正处理。 -
更好的扩展性
引入了状态处理的公共接口后,使得扩展新的状态变得非常容易,只需要新增加一个实现状态处理的公共接口的实现类,然后在进行状态维护的地方,设置状态变化到这个新的状态即可。 -
显式化进行状态转换
状态模式为不同的状态引入独立的对象,使得状态的转换变得更加明确。而且状态对象可以保证上下文不会发生内部状态不一致的情况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。
模式的缺点
- 引入太多的状态类
状态模式也有一个很明显的缺点,一个状态对应一个状态处理类,会使得程序引入太多的状态类,使程序变得杂乱。
思考
模式本质:根据状态 来分离和选择行为。
开发中的应用场景:
-
对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。
-
代码中包含大量与对象状态有关的条件语句
网友评论