zoukankan      html  css  js  c++  java
  • GOF23设计模式之状态模式(state)

    一、状态模式概述

      用于解决系统中复杂对象的状态转换以及不同状态下行为的封装问题。

      结构:

        (1)Context 环境类

            环境类中维护一个 State 对象,它定义了当前的状态。

        (2)State 抽象状态类

        (3)ConcreteState 具体状态类

            每一个类封装了一个状态对应的行为。

    二、状态模式场景导入

      酒店系统中,房间的状态变化:

        (1)空闲状态

        (2)已预订状态

        (3)已入住状态

      当遇到需要频繁修改状态的状况时,就可以考虑使用状态模式。

    三、状态模式示例代码

    1 /**
    2  * 状态接口
    3  * @author CL
    4  *
    5  */
    6 public interface State {
    7     void handle();
    8 }
     1 /**
     2  * 房间空闲状态
     3  * @author CL
     4  *
     5  */
     6 public class FreeState implements State {
     7 
     8     @Override
     9     public void handle() {
    10         System.out.println("房间空闲,可以预定!");
    11     }
    12 
    13 }
     1 /**
     2  * 房间预定状态
     3  * @author CL
     4  *
     5  */
     6 public class BookedState implements State {
     7 
     8     @Override
     9     public void handle() {
    10         System.out.println("房间已预订,可以入住!");
    11     }
    12 
    13 }
     1 /**
     2  * 房间已入住状态
     3  * @author CL
     4  *
     5  */
     6 public class CheckedInState implements State {
     7 
     8     @Override
     9     public void handle() {
    10         System.out.println("房间已入住,不能预定!");
    11     }
    12 
    13 }

      测试:

     1 /**
     2  * 测试状态模式
     3  * @author CL
     4  *
     5  */
     6 public class Client {
     7 
     8     public static void main(String[] args) {
     9         HomeContext hc = new HomeContext();
    10         
    11         //修改为空闲状态
    12         hc.setState(new FreeState());
    13     
    14         //修改为已预订状态
    15         hc.setState(new BookedState());
    16         
    17         //修改为已入住状态
    18         hc.setState(new CheckedInState());
    19     }
    20 }

      控制台输出:

    修改状态:房间空闲,可以预定!
    修改状态:房间已预订,可以入住!
    修改状态:房间已入住,不能预定!

    四、状态模式常见开发应用场景

      (1)银行系统中账号状态的管理;

      (2)OA 系统中公文状态的管理;

      (3)酒店系统中,房间状态的管理;

      (4)线程对象各状态之间的切换;

      (5)…………

  • 相关阅读:
    HDU 1874 畅通project续 最短路径入门(dijkstra)
    怎样推断 ios设备的类型(iphone,ipod,ipad)
    双向数据绑定---AngularJS的基本原理学习
    常见的CPU訪问引起的内存保护问题为什么仅仅用event_122上报
    最简单的基于FFmpeg的视频编码器-更新版(YUV编码为HEVC(H.265))
    【Java项目实战】——DRP之HTML总结
    myql5.7.7优化配置參数
    2014年七月最佳jQuery插件荟萃
    敏捷DoD完毕定义的多种形态
    c#网络通信框架networkcomms内核解析之三 消息同步调用
  • 原文地址:https://www.cnblogs.com/cao-lei/p/8334305.html
Copyright © 2011-2022 走看看