旅行中的状态(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

腾讯ACE反作弊系统:内核驱动与AI行为分析如何守护游戏公平

在游戏安全领域,反作弊技术是保障公平竞技环境的核心防线。其基本原理是通过监控系统关键行为,识别并阻断非法的第三方程序干预。从技术实现看,现代反作弊方案普遍采用分层防御架构,结合用户态模块进行应用层检测,并依赖内核态驱动实现底层深度监控,以此构建纵深防御体系。这种技术的核心价值在于,它能有效对抗从简单内存修改到高级驱动级作弊等多种威胁,维护游戏经济系统和玩家体验的完整性。随着作弊手段的演进,行为分析与AI赋能变得至关重要,系统通过机器学习模型分析进程行为序列的异常模式,即使面对未知特征的外挂变种也能进行有效识

weixin_33978578的博客 742

前人栽树后人乘凉(Template)

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

何双江(yarshray)的专栏 1467

DSSAT模型建模教程

随着数字农业和智慧农业的发展,基于过程的作物生长模型(Process-based Crop Growth Simulation Model)在模拟作物对气候变化的响应与适应、农田管理优化、作物品种和株型筛选、农业碳中和、农田固碳减排等领域扮演着越来越重要的作用。现有版本V4.7能模拟27种主要农作物的生长发育和产量形成过程,被广泛应用于精细农业、水肥管理、气候变化、粮食安全、土壤碳周转、环境影响、农业可持续性、农业生态等诸多与农业生产和科研有关的领域。如果你是个模型入门者,这次将让你体验一键模拟的乐趣。

weixin_55561616的博客 1413

魔法牌里的模式(Bridge)

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

何双江(yarshray)的专栏 1459

使用vcpkg快速安装opencascade并自动配置部署开发环境

广泛的开源库:vcpkg 提供了上千个流行的 C++ 开源库,用户可以通过简单的命令安装和集成这些库,包括 Boost、OpenCV、SQLite、fmt 等。确保包版本一致性:通过 vcpkg.json 文件,开发者可以指定依赖的库版本,确保项目在不同环境下的构建结果一致,避免由于依赖库版本不一致而导致的构建问题。强大的社区支持:Vcpkg 是开源项目,拥有活跃的社区和微软团队的支持,提供了稳定的更新和问题修复。快速更新:Vcpkg 社区活跃,库的更新速度较快,开发者可以迅速获得库的最新版本。

loujiand的博客 2293

高通camx架构学习(零)—— 深入理解Camera 硬件抽象层

从上面的定义可以看出,主要是通过hw_module_t 代表了模块,通过其open方法用来打开一个设备,而该设备是用hw_device_t来表示,其中除了用来关闭设备的close方法外,并无其它方法,由此可见谷歌定义的HAL接口,并不能满足绝大部分HAL模块的需要,所以谷歌想出了一个比较好的解决方式,那便是将这两个基本结构嵌入到更大的结构体内部,同时在更大的结构内部定义了各自模块特有的方法,用于实现模块的功能,这样,一来对上保持了HAL的统一规范,二来也扩展了模块的功能。

图像学习之旅 1669

中介者(Mediator)

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

何双江(yarshray)的专栏 1322

FineBI制作数据可视化大屏-数据连接(1)

快速上手大屏可视化,FineBI数据连接配置。

Pangaoyang_的博客 1912

决策者得选择(Strategy)

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

何双江(yarshray)的专栏 1290

Qt C++ HTTP 调用通义千问大模型 X 学术论文润色工具(SCI 格式适配)

请求地址:`https://dashscope.aliyuncs.com/api/v1/services/aigc/text-generation/generation`;| Windows | 打包时携带 `Qt6Network.dll`/`libcrypto-1_1-x64.dll` 等依赖;| Linux | 安装 `libssl-dev` 和 `libcurl4-openssl-dev`;| API 调用失败 | 检查 API-KEY 是否有效;

寒寒豆豆软件公司的博客 104

前端build工程的时候 出现 `build.rollupOptions.external 的解决方法

看到这个Bug,理性分析: 遇到 Rollup failed to resolve import “@vue/devtools-api” 错误可能是由于 Pinia 使用了 @vue/devtools-api 模块,而 Vite 的 Rollup 插件无法解析这个模块 ps:但是我前一秒还可以,加了个别代码,突然不行,我是不相信的 = - =

码农研究僧的博客 3055

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

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

何双江(yarshray)的专栏 1268

什么是 SAP PCE?

SAP Private Cloud Edition 是一种基于云计算的部署模式,它结合了公有云的灵活性和私有云的安全性,为企业提供了量身定制的云服务。在 PCE 环境中,SAP 托管和维护客户的应用系统(如 SAP S/4HANA、SAP SuccessFactors 或 SAP BW/4HANA),同时客户拥有更高的定制化权限。专属环境:每个客户在云中拥有独立的资源,这保障了更高的安全性和性能。全面托管:SAP 提供基础架构、系统管理和更新服务,降低了客户的运维成本。灵活扩展。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 2242

执行方案(Command)

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

何双江(yarshray)的专栏 1253

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Statistics and Machine Learning Toolbox

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

随着变化而变化(Observer)

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

何双江(yarshray)的专栏 1229

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

让你插上翅膀(Decorator)

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

何双江(yarshray)的专栏 1202

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

魔力拼图(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、付费专栏及课程。

余额充值