>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 21930 个阅读者 刷新本主题
 * 贴子主题:  Java设计模式:状态模式 回复文章 点赞(0)  收藏  
作者:flybird    发表时间:2020-01-30 22:54:40     消息  查看  搜索  好友  邮件  复制  引用

  

状态模式

     在状态模式(State Pattern)中,类的行为是基于它的状态改变的。这种类型的设计模式属于行为型模式。

     在状态模式中,我们创建表示各种状态的对象和一个行为随着状态对象改变而改变的 context 对象。    

介绍

     意图:允许对象在内部状态发生改变时改变它的行为,对象看起来好像修改了它的类。

         主要解决:对象的行为依赖于它的状态(属性),并且可以根据它的状态改变而改变它的相关行为。

         何时使用:代码中包含大量与对象状态有关的条件语句。

         如何解决:将各种具体的状态类抽象出来。

         关键代码:通常命令模式的接口中只有一个方法。而状态模式的接口中有一个或者多个方法。而且,状态模式的实现类的方法,一般返回值,或者是改变范例变量的值。也就是说,状态模式一般和对象的状态有关。实现类的方法有不同的功能,覆盖接口中的方法。状态模式和命令模式一样,也可以用于消除 if...else 等条件选择语句。

         应用范例:

1、打篮球的时候运动员可以有正常状态、不正常状态和超常状态。

2、曾侯乙编钟中,'钟是抽象接口','钟A'等是具体状态,'曾侯乙编钟'是具体环境(Context)。

         优点:

1、封装了转换规则。

2、枚举可能的状态,在枚举状态之前需要确定状态种类。

3、将所有与某个状态有关的行为放到一个类中,并且可以方便地增加新的状态,只需要改变对象状态即可改变对象的行为。

4、允许状态转换逻辑与状态对象合成一体,而不是某一个巨大的条件语句块。

5、可以让多个环境对象共享一个状态对象,从而减少系统中对象的个数。

        缺点:

1、状态模式的使用必然会增加系统类和对象的个数。

2、状态模式的结构与实现都较为复杂,如果使用不当将导致程序结构和代码的混乱。

3、状态模式对"开闭原则"的支持并不太好,对于可以切换状态的状态模式,增加新的状态类需要修改那些负责状态转换的源代码,否则无法切换到新增状态,而且修改某个状态类的行为也需修改对应类的源代码。

        使用场景:

1、行为随状态改变而改变的场景。

2、条件、分支语句的代替者。

         注意事项:在行为受状态约束的时候使用状态模式,而且状态不超过 5 个。        

实现

     我们将创建一个 State 接口和实现了 State 接口的实体状态类。Context 是一个带有某个状态的类。

     StatePatternDemo,我们的演示类使用 Context 和状态对象来演示 Context 在状态改变时的行为变化。

    点击在新窗口中浏览原图
CTRL+鼠标滚轮放大或缩小

步骤 1

     创建一个接口。                      

State.java

public   interface   State   {
    public   void   doAction ( Context   context ) ;
}

步骤 2

     创建实现接口的实体类。                      

StartState.java

public   class   StartState   implements   State   {

    public   void   doAction ( Context   context )   {
       System . out . println ( " Player is in start state " ) ;
       context . setState ( this ) ;
    }

    public   String   toString ( ) {
       return   " Start State " ;
    }
}

StopState.java

public   class   StopState   implements   State   {

    public   void   doAction ( Context   context )   {
       System . out . println ( " Player is in stop state " ) ;
       context . setState ( this ) ;
    }

    public   String   toString ( ) {
       return   " Stop State " ;
    }
}

步骤 3

     创建 Context 类。                      

Context.java

public   class   Context   {
    private   State   state ;

    public   Context ( ) {
       state  =  null ;
    }

    public   void   setState ( State   state ) {
       this . state  =  state ;    
    }

    public   State   getState ( ) {
       return   state ;
    }
}

步骤 4

     使用 Context 来查看当状态 State 改变时的行为变化。                      

StatePatternDemo.java

public   class   StatePatternDemo   {
    public   static   void   main ( String [ ]   args )   {
       Context   context  =  new   Context ( ) ;

       StartState   startState  =  new   StartState ( ) ;
       startState . doAction ( context ) ;

       System . out . println ( context . getState ( ) . toString ( ) ) ;

       StopState   stopState  =  new   StopState ( ) ;
       stopState . doAction ( context ) ;

       System . out . println ( context . getState ( ) . toString ( ) ) ;
    }
}

步骤 5

     执行程序,输出结果:

Player is in start state

Start State

Player is in stop state

Stop State

  




程序猿的技术大观园:www.javathinker.net



[这个贴子最后由 flybird 在 2020-02-05 11:17:59 重新编辑]
  Java面向对象编程-->多线程(上)
  JavaWeb开发-->JSP中使用JavaBean(Ⅰ)
  JSP与Hibernate开发-->持久化层的映射类型
  Java网络编程-->Socket用法详解
  精通Spring-->计算属性和数据监听
  Vue3开发-->组合(Composition)API
  为网站代码块pre标签增加一个复制代码按钮代码
  java的三种随机数生成方式
  10道Java编程基础练习题
  java实现动态编译并动态加载
   JAVA进阶之IO模型深入解析
  NIO底层原理
  观察者模式和发布订阅模式的区别
  被迫重构代码,这次我干掉了 if-else
  JDBC API中的桥接模式
  java NIO示例以及流程详解
  java常见的几种调用机制:同步调用,异步调用,回调
  正则表达式:运算符优先级
  Java入门实用代码:修改文件最后的修改日期
  Java入门实用代码:打印平行四边形
  jdbc连接各种数据库代码
  更多...
 IPIP: 已设置保密
树形列表:   
[url=https://www.1685770.c... 发货33 2022-09-13 11:32:23
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。