美文网首页
状态模式

状态模式

作者: 忘净空 | 来源:发表于2016-08-18 17:35 被阅读15次

    模式定义:

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

    模式结构

    模式结构

    代码实现

    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. 代码中包含大量与对象状态有关的条件语句

    相关文章

      网友评论

          本文标题:状态模式

          本文链接:https://www.haomeiwen.com/subject/oqwvsttx.html