旅行中的状态(state)

揭秘密码安全:守护数字世界的密钥(四)——未来密码革命 单点登录与传统方式的区别专题及下文请收看揭秘密码安全:守护数字世界的密钥(五)——未来密码革命(单点登录专项)别忘记点关注欧!!! 阅读详情

 

我不知道我的这个标题是否合适.反正不管了.我只是希望用轻松的写法把设计模式表示清楚.(当然也许不清楚)反正我就怎么写了.OK,现在好了.如果在旅行中一个旅者有很多种状态.这些状态会直接影响到他的行为.例如.饿了就去吃饭.渴了就要喝水.累了就要休息.正常状态就要继续旅行.并且这些状态相互切换.那么你会怎么做?如果是我.我首先会想到使用开关.那要直观简单.Ok那我们就那么做

enum myState {HUNGRY ,ADRY,TIRE,OK};
public class StateManager{

  private myState state=null;

  public void Execute(){
//执行状态
            DoThing dt=new DoThing(state);
    dt.Execute();
//切换状态
                 swich(state){
                  case  myState.HUNGRY: 
                      state=myState.ADRY;
                   case  myState.ADRY:
                     state=myState.TIRE;
                   case  myState.TIRE:
                     state.=myState.OK;
                    case  myState.OK:                      
                      state.=myState.HUNGRY;
                  }
      }
}
public class DoThing{
      private myState state=null;
      DoThing(myState svalue){
               state=svalue;
      }
     public  void  Execute(){
                swich(this.state){
                   case  myState.HUNGRY: 
                       Console.Writeline("吃饭");
                   case  myState.ADRY:
                       Console.Writeline("喝水");
                   case  myState.TIRE:
                      Console.Writeline("休息");
                    case  myState.OK:                      
                      Console.Writeline("继续旅行");
                   }
     }
}

由以上可以看出.状态的变化直接影响到了.所要发生的事情.并且状态是在不断发生变化的.如果试想一下在复杂的情况下不是简单的赋值而是要做很多复杂的工作.例如POP邮箱TcpConection这样的情况开关语句显得很繁琐.也许你会说写函数,可是那一的情况是不够通用.并且不符合面向对象原则.是的接下来我们依然要做的是把开关踢掉.因为我们有理由相信我们有更好的办法来解决问题.
由以上我们可以看出.状态由一个状态管理者和状态本身来决定其行为.因此.要考虑的是如何让管理者能管理更多的状态.也就是说状态必须被抽象出来.换句话说也就是要使用接口或抽象类来解决问题.
interface ImyState{
       void Execute(StateManager sm);
       myState  getState();
}
这就是一个抽象的状态.也就是其他具体的状态要派生至此.并且我们还必须要改写管理者对象.因为实际管理对象来完成开关所必须的指责.当然我们不用开关语句或if...else if.....而是用对象来出来具体情况.不相信就看着吧.....
public class Hungry_State : ImyState{
       void Execute(StateManager sm){
  //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
        }
       myState  getState(){
          retuen  myState.HUNGRY;
        }
}
public class ADRY_State : ImyState{
       void Execute(StateManager sm){ 
     //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
        }
      myState  getState(){
          retuen  myState.ADRY;
       }
}
public class TIRE_State : ImyState{
     void Execute(StateManager sm){
       //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
      }
       myState getState(){
          retuen  myState.TIRE;
       }
}
public class OK_State : ImyState{
       void Execute(StateManager sm){
         //切换到下一个状态
          sm.setState(new ADRY_State());
          sm.Execute();
         }
       myState getState(){
          retuen  myState.OK;
        }
}

public class StateManager{
   private  myState ms=null;
   void setState(ImyState ims){
       ms=ims;
    }
    void Execute(){
     ms.Execute(this);
     DoThing dt=new DoThing(this.ms.getState());
 dt.Execute();
   }
}

至此,管理者也重构完毕.这样我们就没有使用开关语句.而使用了更适合的面向对象原则.

UDS协议中的定时器机制:P2与S3定时器的实战解析 本文深入解析UDS协议中的P2与S3定时器机制,探讨其在汽车电子诊断中的关键作用。通过实战案例分享定时器参数设置的最佳实践,包括P2定时器的双面性、S3定时器的会话管理艺术,以及定时器参数的调优技巧,帮助工程师优化诊断效率与稳定性。 阅读详情

相关推荐

谈谈这一年来做项目的经历(1)

一年项目经历

JamsStack的博客 2176

C#中多重继承

其实想写这篇文章,是因为突然在整理论坛上的帖子的时候,突然发现一个人问我如何才能在C#中实现多重继承,当时我答的很隐晦,因此这里我想补充说明一下.首先,我要说明一下,C#中是没有类的多重继承这个概念.要使用多重继承必须要通过接口Interface来完成.可是大家都知道Interface实际上就是一个虚函数列表指针.内部封装的只有函数和属性.而且接口(Interface)不能实力化只能通过派生(

何双江(yarshray)的专栏 6491

拿到一个新 bug 怎样分析

拿到一个新 bug 怎样分析

专栏 1418

通讯兵(Chain of Responsibility)

 如果看英文名字的话你可能会想到责任链.其定义为使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。那么可能会误解.其实这个模式很类似消息通讯.也就好象是在对应的消息函数.至少我看完这个模式首先想到的就是这个.的确也是十分象.你甚至也可以构造一个句柄来判断消息处理函数.当然我们没必要

何双江(yarshray)的专栏 1654

40万网站一夜裸奔!WordPress大厂遭黑客“抄底”:为什么连你的2FA双重验证码都被偷了?

在过去很多人的潜意识里,网络安全就像是一场“攻防战”:黑客是门外的野蛮人,拿着各种扫描工具在你的网站门口撬锁;而我们是守城人,只要不下载破解版插件(Nulled)、按时更新正版软件、后台用上强密码,甚至加上双重身份验证(2FA),就足以把99%的毛贼挡在门外。

网络研究观 253

双轴按键摇杆模块原理与嵌入式驱动实战

双轴按键摇杆是一种融合模拟量(X/Y轴)与数字量(Z轴按键)的复合型人机交互传感器,其本质基于电位器分压原理与机械开关通断特性。通过ADC采集连续电压信号并结合数字IO检测按键状态,可实现高鲁棒性的二维运动感知与触发控制。该方案技术门槛低、成本可控、兼容性强,广泛应用于智能小车、DIY游戏手柄、工业HMI及教育开发板等嵌入式场景。文中深入解析电位器线性度、KEY引脚开漏特性、ADC参考电压稳定性及软件消抖状态机等关键工程要素,为基于Arduino、STM32或ESP32平台的快速集成提供可复用的技术路径。

weixin_30995917的博客 82

前人栽树后人乘凉(Template)

 这个模式可能是目前最简单的模式了.因为几乎所有的面向对象语言都支持抽象因为.毕竟这是面向对象的基本法则.而Template的模式定义一个操作中的算法的骨架,而将一些步骤延迟到子类中,这在明确不过了.就是使用抽象类.所以几乎不用太过多的介绍什么.不过考虑到要写完所有的23种模式所以,还是写一篇吧虽然简单.但是常见.也很通用.假如我们要设计一个容器.而容器的样式无法提前确定,

何双江(yarshray)的专栏 1467

6层高速PCB设计实战:BGA布局与阻抗匹配关键解析

本文深入解析6层高速PCB设计中BGA布局与阻抗匹配的关键技术。通过实战经验分享,详细介绍了六层PCB层叠结构的选择与优化、BGA器件布局技巧、阻抗匹配的实战经验以及高速布线技巧,帮助工程师提升PCB设计水平,确保信号完整性和电源完整性。

weixin_28481133的博客 368

魔法牌里的模式(Bridge)

 不知道各位有没有玩过魔法牌.基本分也两种.一种称为攻击卡.另一种称为辅助卡片.攻击卡负责攻击.而辅助卡则负责效果.例如加强攻击效果.或者减弱敌方攻击效果等等这样看了.实现部分是就是所谓的攻击卡.而抽象部分就是效果卡.他们有联系可是联系并非平行的联系.也就是说并不象如同剑士可以派生出魔法剑士,光明剑士等这样的情况攻击效果卡.和攻击卡本身的联系不是静态的可以通过继承来完成的.而是

何双江(yarshray)的专栏 1459

无线Mesh组网全攻略:从原理、部署到调优与排障

对于布线困难的大户型、复式楼或园区,传统的无线中继往往面临带宽减半和链路不稳定的问题。无线Mesh网络通过多跳转发与自组织路由,让每个节点无需网线即可协作扩展覆盖,并依靠动态路径选择实现自愈。其核心技术涉及802.11s、HWMP路由协议,以及802.11k/v/r协同的无缝漫游,能有效提升终端切换体验。在实际部署中,设备选型、回程频段规划与布点位置直接决定网络质量。围绕无线Mesh的组网原理、设备选型、配置调优与故障排查,提供一套工程实践参考,帮助用户在复杂环境下构建稳定高效的无缝覆盖。

weixin_34098209的博客 271

MCP开发实战:基于openEuler系统MCP插件的开发、测试与发布全流程

MCP开发实战:基于openEuler系统MCP插件的开发、测试与发布全流程

jks212454的博客 555

中介者(Mediator)

 这个模式的定义就很简单用一个中介对象来封装一系列的对象交互。中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。好处是什么呢?很显然就是为了降低复杂度.使的原本使多对多关系.现在变成了1对多关系.因为所有对象都只和Mediator中介者单线联系.而中介者隐士的包含了对象之间的关系.下面还是举个简单的事例.如:小王要把稿件交给小李.小李要

何双江(yarshray)的专栏 1322

PCL K4PCS算法实现点云粗配准【2026最新版】

K4PCS算法实现点云粗配准。博客长期更新,本文最近一次更新时间为:2026年5月4日。

点云侠的博客 42万+

决策者得选择(Strategy)

 我们似乎总是在为选择这个词苦恼.当我们选择生活得时候就放弃了激情.当我们选择程序员得时候就放弃了时间.这一切都是在动态得抉择得.并非有命运决定.而是在动态得自身来决定.好了现在考虑一个比较现实得问题.假设.如果你有个临时会议.却无法确定什么时候要去.因为是临时决定得.就无法决定.如果现在得时间是5:00--6:00那么你必须要去参加.否则你依然可以留在公司办公.且开会和办

何双江(yarshray)的专栏 1290

【控制模块算法】控制理论的进修之路

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、(经典)自动控制理论【本科阶段】二、现代控制理论【本科阶段】三、最优控制理论【硕士阶段】总结 前言 认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长! 本文先对对控制理论的理解做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章 提示:以下是本篇文章正文内容 一、(经典)自动控制理论【本科阶段】 一般控制工程、自动化相关的考研专业课就是自动

qq_35635374的博客 1448

基于自适应小波阈值算法的图像去噪

自适应小波阈值算法是一种基于小波变换的方法,它相对于传统的小波阈值去噪方法具有更好的性能和鲁棒性。该算法首先对图像进行小波变换,然后根据小波系数的大小确定一个自适应的阈值,将小波系数与阈值进行比较,大于阈值的系数被保留,小于阈值的系数被置零。在上述代码中,首先选取了小波函数sym4进行小波分解,然后根据标准差计算出阈值,使用wthresh函数进行阈值处理,最后进行反变换得到处理后的图像。该GUI界面与前面的自适应小波阈值算法代码结合,实现了图像的去噪,并提供了可视化的效果。

与其临渊羡鱼,不如退而结网 558

由实例计数器引出(C#)

由实例计数器引出(C#)好久没发表文章了,说也有趣,突然感觉C#中的有些类,为什么,其构造器是不可见的?而且通常这些类在一个程序中往往只有一个实例存在。于是,我做了个实验结果如下:由该例子引出:using System;   namespace ConsoleApplication1{ ///  /// Class1 的摘要说明。 ///  class Class1 {  ///   

何双江(yarshray)的专栏 1268

前端使用二开Thingsboard一、二、三事(四)-部件库

以项目实战为基础,逐步介绍前端在thingsboard系统二次开发中的一些注意事项以及一些thingsboard一些页面功能讲解,为前端人员开发使用thingsboard提供一种可靠思路,打造一个完美的物联网系统。

weixin_43163457的博客 739

执行方案(Command)

 这个模式.可能是变化比较多的一个模式.也是最没有定型的一个模式.因为相对比较灵活.常见的是对GUI图形界面的命令封装这样即使更改界面元素只要功能不变那么也不影响执行效果.就如同以前面向过程的编程环境那要.吧功能封装到多个过程.进行调用.但是Command模式.又一个优点就是可以还原把以前做过的工作还原到未做工作之前.这个也就是事务性.这就必须要一个事务列表来维护.事务回滚

何双江(yarshray)的专栏 1253

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

随着变化而变化(Observer)

 对于很多事物.都在不断变化.也就是说.在不断变化的情况下.我们必须能够得到其相互关联的对象之间的变化.也就是能够通知到其他对象.但不同于牵一动百的情况因为毕竟只是告诉相互关联的对象与之对应的数值才发生变化.换句话就是某个对象的状态发生变化.于它相对应的一组对象将要随着变化.这里就引出了观察者.通知者的对应关系.观察者发现变化.通知者就告诉每个与之相关的对象都发生相应的变化.

何双江(yarshray)的专栏 1229

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

让你插上翅膀(Decorator)

 对你的对象进行扩展这是在平常不过的事情了.问题是,你该如何做?很多方案不是吗?例如派生子类是的.这是个不错的方案.可是如果是在这样一种情况.我们需要在运行期间添加功能并且有客户程序来决定合适添加何种功能.那么单纯的扩展子类对象能够办到吗?那么我们必须想办法新的办法了.是的.你也许已经想到我要说的Decorator模式了吧.由它来帮你在想要的时候插上翅膀.通过接口来组合是个非常

何双江(yarshray)的专栏 1202

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

魔力拼图(Builder)

 假如有一种拼图可以拼贴成任何图形.那么我们只要生产出这种拼图的单个部件就可以了.那样就会使复杂的图形变的简单化.也就是说我们只用设计每一个单个步骤就可以了.这样做的好处是什么呢?很显然.我们在利用元件生产产品.而不需要直接生产一个巨大的产品.因为可能这些元件本身就具有通用性.另外的好处是.来自与其本身的复杂性.因为要生产就必须要组装.而把生产和组装分开来考虑.那么复杂性就会有

何双江(yarshray)的专栏 1192

我的代理人(Proxy)

 很显然.我们目前所生活的世界里.到处都有这类人.他们很愿意帮助我们去完成我自身完成起来很困难的工作.愿意充当一个中间层.在这一个层次中.Proxy代理就是主导.他会为我们处理那些看上去很别扭的事情.毕竟我们的目的是制定总体方针.儿细节可以交给代理来完成.事实上,很多情况.我们都用到了代理.例如典型的我们在.NET中使用WebService就已经在使用Proxy.通过这个代理和实际的远程对象打

何双江(yarshray)的专栏 1182

订阅属于自己得资料(Visitor)

 有时候.我们总是不希望出现不速之客.而是更希望来的是我们的朋友.可是如果用一支普通的笔把所有人的名字记录下来我们很难判断那些才是我们的朋友.所以.如果有一支友情之笔和一个之能呈现友情之笔的笔记本.那么情况就好的多了.就如同当你使用ArrayList或Hashtable之类的容器装载数据的时候.所有的数据都别染成了同样的颜色---object 而你必须时刻判断是否你想要的数据类

何双江(yarshray)的专栏 1172

共同的天空(FlyWeight)

 很多情况下.大量的类似之处使得我们不得不为重复的数据使用少的可怜的内存.这样的情况很糟糕.既然如此.我们必须找到一个好的办法.把那些可能重复的数据统一管理这样是在合理不过的事情了.好的..我们应该从如下几个方面来考虑.首先要找出对象之间的共同之处.这部分是可以共享.那么就需要封装到一个类中.那么剩下的不能共享的就只好封装到另外的类中.换句话说.就是把对象的粒度扩大.让FlyW

何双江(yarshray)的专栏 1158
上一篇: 我的代理人(Proxy)
下一篇: 孪生兄弟(Prototype)
yarshray
博客等级 码龄25年 72粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值