状态模式

模式定义:

允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。

模式结构

模式结构

代码实现

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);
    }
}

模式的优缺点

模式的优点

  1. 简化应用逻辑控制
    状态模式使用单独的类来封装一个状态的处理。如果把一个大的程序控制分成很多小块,每块定义一个状态来代表,那么就可以把这些逻辑控制的代码分散到很多单独的状态类当中去,这样就把着眼点从执行状态提高到整个对象的状态,使得代码结构化和意图更清晰,从而简化应用的逻辑控制。对于依赖于状态的if-else,理论上来讲,也可以改变成应用状态模式来实现,把每个if或else块定义一个状态来代表,那么就可以把块内的功能代码移动到状态处理类去了,从而减少if-else,避免出现巨大的条件语句。

  2. 更好的分离状态和行为
    状态模式通过设置所有状态类的公共接口,把状态和状态对应的行为分离开来,把所有与一个特定的状态相关的行为都放入一个对象中,使得应用程序在控制的时候,只需要关心状态的切换,而不用关心这个状态对应的真正处理。

  3. 更好的扩展性
    引入了状态处理的公共接口后,使得扩展新的状态变得非常容易,只需要新增加一个实现状态处理的公共接口的实现类,然后在进行状态维护的地方,设置状态变化到这个新的状态即可。

  4. 显式化进行状态转换
    状态模式为不同的状态引入独立的对象,使得状态的转换变得更加明确。而且状态对象可以保证上下文不会发生内部状态不一致的情况,因为上下文中只有一个变量来记录状态对象,只要为这一个变量赋值就可以了。

模式的缺点

  1. 引入太多的状态类
    状态模式也有一个很明显的缺点,一个状态对应一个状态处理类,会使得程序引入太多的状态类,使程序变得杂乱。

思考

模式本质:根据状态 来分离和选择行为。

开发中的应用场景:

  1. 对象的行为依赖于它的状态(属性)并且可以根据它的状态改变而改变它的相关行为。

  2. 代码中包含大量与对象状态有关的条件语句

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容