>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 22109 个阅读者 刷新本主题
 * 贴子主题:  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面向对象编程-->Java注解
  JavaWeb开发-->开发JavaMail Web应用
  JSP与Hibernate开发-->通过JPA API检索数据
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->绑定表单
  Vue3开发-->Vue组件开发基础
  JDK17的新特性
  TCP、UDP及Socket代码示例
  NIO底层原理
  我是如何把一个15分钟的程序优化到了10秒的
  面试官问:如何排除Java虚拟机的GC引起的CPU飙高?
  java 中文繁简体转换工具 opencc4j
  分布式锁的原理和实现
  java万年历简单制作
  Java注解的定义和使用
  面试必考-static、final和单例模式
  Java设计模式:抽象工厂模式
  java比c++强大之处JVM垃圾收集算法
  Java入门实用代码:集合输出
  Java判断一个字符是否为中文字符
  Java入门实用代码:删除一个文件目录
  更多...
 IPIP: 已设置保密
楼主      
该用户目前不在线 发货33 
  

威望: 0
级别: 侠客
魅力: 195
经验: 195
现金: 1152
发文章数: 19
注册时间: 0001-01-01
 消息  查看  搜索  好友  邮件  复制  引用


168开奖网结果
168won福彩3D稳赚方法

200多年前,欧洲人在中国发现了能够一年四季开花的中国月季花,不久,中国的红茶香、黄茶香、朱红、月月红等月季花被引入欧洲,与那里的玫瑰和蔷薇杂交。经过反复的杂交,定向选育,育成了许多婀娜多姿的杂交新品种,不仅丰富了玫瑰家族的品种和花色,同时也解决了玫瑰一年只开一季花的问题。玫瑰的种植很快风行世界。  法国皇后约瑟芬推动了东
168wonSG飞艇开奖直播
发文章时间 2022-09-13 11:32:23
 IPIP: 已设置保密 1 楼     
1页 1条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


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