设计模式之状态模式-State

2024-06-20 05:32

本文主要是介绍设计模式之状态模式-State,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

State状态设计模式类似于Switch多路分支功能的开关,State状态模式机制如下:

状态模式UML图如下:


State状态设计模式用于改变对象的行为,在代理的生命周期里,随着状态变化从一个目标实现程序切换到另一个目标实现程序。

我们经常遇到如下的程序代码:

[java] view plain copy
  1. public class Creature{  
  2.      private Boolean isFrog = true;//标识  
  3.      public void greet(){  
  4.            if(isForg){  
  5.         System.out.println(“Ribbet!”);  
  6.        }else{  
  7.         System.out.println(“Darling!”);  
  8.        }  
  9.      }  
  10.      //转换标识  
  11.      public void kiss(){  
  12.     isForg = false;   
  13.      }  
  14.      public static void main(String[] args){  
  15.            Creature creature = new Creature();  
  16.            creature.greet();  
  17.            creature.kiss();  
  18.            creature.greet();  
  19.      }  
  20. }  
上面例子代码中greet()方法在执行具体操作之前必须要判断一下标识,代码显得笨拙繁琐,使用简单State状态模式改写上面代码如下:

[java] view plain copy
  1. public class Creature{  
  2.     //状态接口  
  3.     private interface State{  
  4.           String response();  
  5.     }  
  6.     private class Forg implements State{  
  7.           public String response(){  
  8.        return “Ribbet!”;  
  9.           }  
  10.     }  
  11.     private class Prince implements State{  
  12.           public String response(){  
  13.        return “Darling!”;  
  14.           }  
  15.     }  
  16.     private State state = new Forg();  
  17.     public void greet(){  
  18.           System.out.println(state.response);  
  19.     }  
  20.     public void kiss(){  
  21.           state = new Prince();  
  22.     }  
  23.     public static void main(String[] args){  
  24.           Creature creature = new Creature();  
  25.           creature.greet();  
  26.           creature.kiss();  
  27.           creature.greet();  
  28.     }   
  29. }  

State状态设计模式中,状态自动切换并传播,不需要再改动标识,代码显得非常优雅。

State状态设计模式一个基本框架如下:

[java] view plain copy
  1. //状态接口  
  2. interface State{  
  3.     void operation1();  
  4.     void operation2();  
  5.     void operation3();  
  6. }  
  7. //状态实现类1  
  8. class implementation1 implements State{  
  9.     public void operation1(){  
  10.         System.out.println(“Implementation1.operation1()”);  
  11.     }  
  12.     public void operation2(){  
  13.         System.out.println(“Implementation1.operation2()”);  
  14.     }  
  15.    public void operation3(){  
  16.         System.out.println(“Implementation1.operation3()”);  
  17.     }  
  18. }  
  19. //状态实现类2  
  20. class implementation2 implements State{  
  21.     public void operation1(){  
  22.         System.out.println(“Implementation2.operation1()”);  
  23.     }  
  24.     public void operation2(){  
  25.         System.out.println(“Implementation2.operation2()”);  
  26.     }  
  27.    public void operation3(){  
  28.         System.out.println(“Implementation2.operation3()”);  
  29.     }  
  30. }  
  31. //服务提供者  
  32. class ServiceProvider{  
  33.     private State state;  
  34.     public ServiceProvider(State state){  
  35.          this.state = state;  
  36.     }  
  37.     //状态更改  
  38.     public void changeState(State newState){  
  39.          state = newState;  
  40.     }  
  41.     public void service1(){  
  42.           //……  
  43.           state.operation1();  
  44.           //……  
  45.           state.operation3();  
  46.     }  
  47.     public void service2(){  
  48.           //……  
  49.           state.operation1();  
  50.           //……  
  51.           state.operation2();  
  52.     }  
  53.     public void service3(){  
  54.           //……  
  55.           state.operation3();  
  56.           //……  
  57.           state.operation2();  
  58.     }  
  59. }  
  60. public class StateDemo{  
  61.     private ServiceProvider sp = new ServiceProvider(new Implementation1());  
  62.     private void run(ServiceProvider sp){  
  63.          sp.service1();  
  64.          sp.service2();  
  65.          sp.service3();  
  66.     }  
  67.     public static void main(String[] args){  
  68.         StateDemo demo = new StateDemo();  
  69.         demo.run(sp);  
  70.         sp.changeState(new Implementation2());  
  71.         demo.run(sp);  
  72.     }  
  73. }  

State状态模式和Proxy代理模式都为客户端程序提供了一个目标程序代理,真正的目标程序被代理所隐藏,当客户端程序调用目标程序时,首先将调用请求发送给代理,代理才真正调用目标程序,但是Proxy代理模式和State状态模式有如下区别:

(1).Proxy代理模式中被调用的目标程序只有一个,而State状态模式中被调用的目标程序有多个。

(2).Proxy代理模式的目的是控制客户端对目标程序的访问,而State状态模式是为了根据条件动态改变目标程序。

转自:点击打开链接

这篇关于设计模式之状态模式-State的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077234

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

SQL Server身份验证模式步骤和示例代码

《SQLServer身份验证模式步骤和示例代码》SQLServer是一个广泛使用的关系数据库管理系统,通常使用两种身份验证模式:Windows身份验证和SQLServer身份验证,本文将详细介绍身份... 目录身份验证方式的概念更改身份验证方式的步骤方法一:使用SQL Server Management S

Redis高可用-主从复制、哨兵模式与集群模式详解

《Redis高可用-主从复制、哨兵模式与集群模式详解》:本文主要介绍Redis高可用-主从复制、哨兵模式与集群模式的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录Redis高可用-主从复制、哨兵模式与集群模式概要一、主从复制(Master-Slave Repli

一文带你搞懂Redis Stream的6种消息处理模式

《一文带你搞懂RedisStream的6种消息处理模式》Redis5.0版本引入的Stream数据类型,为Redis生态带来了强大而灵活的消息队列功能,本文将为大家详细介绍RedisStream的6... 目录1. 简单消费模式(Simple Consumption)基本概念核心命令实现示例使用场景优缺点2

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Nginx location匹配模式与规则详解

《Nginxlocation匹配模式与规则详解》:本文主要介绍Nginxlocation匹配模式与规则,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、环境二、匹配模式1. 精准模式2. 前缀模式(不继续匹配正则)3. 前缀模式(继续匹配正则)4. 正则模式(大

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.