状态模式和策略模式

采用离散模型搭建永磁同步电机控制系统 永磁同步电机发电系统分为控制器和发电机,通过simulink仿真软件进行发电系统的离散系统仿真。离散搭建仿真,可以更方便的自动代码生成。通过实践经验离散模块搭建,更能加深对整个控制系统的理解。离散系统在矢量控制中经常涉及到上个开关周期的角度,电压,或者预测下个周期的角度,电流,一般都是通过延时模块实现。PWM比较值寄存器被改写后都是使能了预装载,采样后触发计算到比较值生效可以延时0.5个开关周期Ts,也可以延时1个开关周期Ts,可以通过离散系统进行仿真,大大缩短开发周期。 阅读详情

状态模式和策略模式

策略模式,简而言之就是解决某个问题的方法。最近在玩原神,而原神由于其氪金机制和各种运行操作使得网上风评不高,而从玩家大体上分为3类:氪金大佬、中小氪和白嫖。而从策略模式分析,为了去抽到角色和武器需要解决方法,而方法分为三种:直接648、氪金+小肝、直接肝报废。而在其中有很多相同的地方,比如消耗相同、肝的方式相同等等。而策略模式就是将一个算法架构放于基类,减少代码重复,之后将某些待拓展点抽象化或者多态操作,使得拓展方便,并且不需要修改基类的算法架构。

状态模式,用来实现状态变化的操作。比如你小时候是4条腿走路、青年是2条、老年是3条,像这样的实现可能比较简单,一个判断分支就行了,可是由于状态变化的时候,可能随之改变的东西很多,比如年纪、身体状况、经济、家庭情况等等,这样的状态变化的情况就可能仅仅使用判断语句了,因此出现状态模式,简而言之,状态模式就是用处理当一个东西的状态改变的时候,数据或者操作变化太过于复杂的时候所用的一种易拓展模式。

基础UML

 

 

策略模式

状态模式

Strategy/State

抽象基础类,大部分情况存储一个算法的共同数据和函数。比如基本价格等等

状态抽象类,大部分情况下存储抽象的共同函数,比如状态下的处理函数

ConcreateXXXX

实际算法节点实现类。当算法中的一些方法节点需要拓展的时候,将节点归类为另外一个方法而派生为一个子类

具体状态实现类。

将东西的状态分离,实现每个状态下需要存储的数据或者进行的操作

Context/Handle

外部的接口类。

使用场景

当一系列类存在很多的相同点,只有一些行为不同的时候

当不同的情况需要动态的使用不同的节点处理方式的时候

状态变化的时候,行为或者数据随之变化的时候

当可能存在分支很庞大的时候,同来替代

优点

可以自由切换算法的某些行为

避免了可能的多条件判断

易拓展

可以用枚举方式省掉许多指针或者对象的传递

每个状态一个类去实现自己需要的行为,易拓展

在使用的时候,可以将不同的变量使用同一个状态类, 减少了类。比如长大状态,涉及到许多因素。

缺点

当方法很多的时候,会导致类比较多

由于客户端使用的方法,会导致所以的类暴露,因此常用中间控件来进行限制

结构和行为比较复杂,因此需要使用仔细

部分支持“开发封闭”,因为可能导致有些地方需要修改

相同点

易拓展

常用中间件在类组和用户之间减少操作和权限设置

差异点

常用于共同点较多的情况,子类只是实现某些特定需求

目的是为在不同的要求下是用不同的方法

常用于状态变化的时候,涉及到的数据或者方法变化过大的情况

目的是为了减少状态变化后导致随之变化太过复杂的情况

实操

UML

 

关于两个模式的思维方式其实大致相同:

1.分析

策略模式:主要分析那些是可共享的,那些是不可共享

状态模式:主要分析分成那些状态,而对应状态的行为、数据是什么

2.继承和派生

只需要先单一的实现基类和派生类就行了

3.中间类的设定

在写完类组之后,会发现客户端使用比较麻烦,因此给定中间状态,设定权限和简化操作等等

4.看是否需要支持自动跳转

看是否需要用责任链的方式,实现状态自动选择的情况

 

而策略模式和状态模式在实现、uml大致是相同的,不同的在于关注点不同:

策略主要关注方法和行为的多种

状态主要关注变化时操作和行为变化太复杂

策略模式代码

// StrategyModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;
#define  interface struct

interface IKillBoss
{
public:
    virtual void ToKillBoss() = 0;
};
class CKillStrategyA:public IKillBoss
{
public:
    void ToKillBoss()
    {
        cout << "屠龙宝刀,只卖999,任何boss不用愁!" << endl;
    }
};
class CKillStrategyB :public IKillBoss
{
public:
    void ToKillBoss()
    {
        cout << "白色大剑 + 普通的肝 , 小氪 +肝,慢慢打穿。" << endl;
    }
};
class CKillStrategyC :public IKillBoss
{
public:
    void ToKillBoss()
    {
        cout << "七彩大腰子 , 只要还没肝硬化,那个boss都不怕。" << endl;
    }
};

class CKillStrategyChoose
{
private:
    IKillBoss* m_kill;
public:
    CKillStrategyChoose(int num)
    {
        if (0 == num)
        {
            m_kill = new CKillStrategyA();
        }
        else if (1 == num)
        {
            m_kill = new CKillStrategyB();
        }
        else if (2 == num)
        {
            m_kill = new CKillStrategyC();
        }
    }
    void KillStrategy()
    {
        if (m_kill)
            m_kill->ToKillBoss();
    }
};

int main()
{
    CKillStrategyChoose kill1(0);
    kill1.KillStrategy();

    CKillStrategyChoose kill2(1);
    kill2.KillStrategy();

    CKillStrategyChoose kill3(2);
    kill3.KillStrategy();
}

状态模式代码

// StateModel.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
using namespace std;

class CWalk;

class IPeopleState
{
public:
    virtual void howToWalk(CWalk *walk) = 0;
};

class COldState :public IPeopleState
{
    void howToWalk(CWalk *walk)
    {
        cout << "老人用3条腿走路。" << endl;
    }
};

class CYoungState:public IPeopleState
{
    void howToWalk(CWalk *walk)
    {
        cout << "青年人用2条腿走路。" << endl;
    }
};

class CChildState :public IPeopleState
{
public:
    void howToWalk(CWalk *walk)
    {
        cout << "小孩用4条腿走路。" << endl;
    }
};

class CWalk
{
private:
    IPeopleState* m_state;
    int m_age;
public:
    CWalk()
    {
        m_state = NULL;
        m_age = 0;
    }

    int getAge() { return m_age; }
    void setAge(int age) { m_age = 0; }

    void setState(IPeopleState* state) { m_state = state; }

    void  toWalk() { m_state->howToWalk(this); }
};

int main()
{
    IPeopleState* state1 = new CChildState();
    IPeopleState* state2 = new CYoungState();
    IPeopleState* state3 = new COldState();

    CWalk *walk = new CWalk();
    walk->setState(state1);
    walk->toWalk();
    walk->setState(state2);
    walk->toWalk();
    walk->setState(state3);
    walk->toWalk();
}

 

坐标偏移不一致或瓦块重名的多个OSGB工程的融合 介绍如何使用实景三维小助手OSGBLab对坐标偏移不一致或瓦块重名的多个OSGB工程的融合 阅读详情

相关推荐

科研绘图避坑指南:用PyMol制作期刊级蛋白-配体相互作用图(含氢键显示技巧)

本文是一份专业的科研绘图避坑指南,详细讲解如何利用PyMol软件制作符合期刊发表标准的蛋白-配体相互作用图。文章重点分享了从构图逻辑、精准选择到氢键等相互作用的艺术化表达技巧,并提供了视觉优化与期刊适配的终极参数设置,帮助科研人员产出兼具科学严谨性与视觉美感的专业图表。

weixin_29292431的博客 270

Java 状态模式, 策略模式(附代码)

在了解状态模式之前,我们先看一看阿里巴巴开发手册上面,表达异常分支时候的处理方式,:如果非使用 if()...else if()...else...方式表达逻辑,避免后续代码维护困难,请勿超过 3 层。超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,这个时候可能有人就问了什么是卫语句呢?不知不觉更到现在也更新了8个设计模式了,希望大家在学习新的设计模式的时候也不要忘记以前学过的设计模式,学会温故而知新,反复揣摩,反复实验,不要把知识仅仅停留在理论阶段。

ZzZzZzZ2h的博客 1123

海康视觉相机驱动软件MVS参数配置全攻略(附接线图+避坑指南)

本文提供了海康视觉相机驱动软件MVS从硬件连接到软件参数配置的完整指南。详细解析了供电与通讯线缆的区分、PNP/NPN信号逻辑的接线避坑方法,并重点阐述了MVS软件中触发模式、网络IP配置、图像采集及光源控制等核心参数的设置技巧,旨在帮助用户快速完成相机调试,实现稳定高效的图像采集。

weixin_29204205的博客 399

状态模式、策略模式

状态模式、策略模式 状态模式和策略模式有些相似,都是能够动态改变对象的行为。但是状态模式是通过状态转移来改变 Context 所组合的 State 对象,而策略模式是通过 Context 本身的决策来改变组合的 Strategy 对象。所谓的状态转移,是指 Context 在运行过程中由于一些条件发生改变而使得 State 对象发生改变,注意必须要是在运行过程中。 状态模式主要是用来解决状态转移的...

cgl_dong的博客 1080

全网最全医学图像数据汇总

本仓库汇总了多个领域的医学图像开源数据集,涵盖CT、MRI、超声、内窥镜、病理、多模态、PET、OCT以及皮肤镜等多种成像技术。每个数据集均详细列出了任务类型、部位、格式、数量及下载链接,旨在为医学图像研究者提供便捷的资源导航。⚠️:这些数据集仅适用于学术研究用途。

2401_83173765的博客 3319

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 326

23种设计模式之状态模式和策略模式的区别

在行为类设计模式中,状态模式和策略模式是亲兄弟,两者非常相似,我们先看看两者的通用类图,把两者放在一起比较一下状态模式与策略模式很相似,确切的说状态模式包含策略模式。策略模式封装的是行为,而状态模式封装的是变化。尽管这么说,但事实上策略模式与状态模式在很多情况下都是可以互相转化的,具体应该使用何种模式,就要从上面的两个方面尽心分析,能够看得出明显状态变化的,当热要用状态模式;...

致力于不留技术债务cuizb.top 5236

博途 V16(TIA portal V16)安装教程

本文提供了西门子TIA Portal V16软件的完整安装指南。内容包括百度网盘下载链接(提取码kv69)、详细安装步骤(关闭安全保护、典型安装设置)、授权破解方法,以及PLCSIM仿真功能的使用说明。重点演示了S7-1200 PLC程序的仿真过程,解析了仿真界面各元素功能,包括状态指示灯(RUN/STOP/ERROR)、操作按钮(RUN/STOP/MRES)和网络接口状态等。通过图文并茂的方式,完整呈现了从软件安装到PLC程序仿真的全流程操作。

lingchen1906的博客 6713

策略模式和状态模式区别简单说明

在结构上非常相似,都是通过封装不同的行为(策略或状态)并动态切换它们,但它们的。当需要在运行时选择不同的算法或行为(如排序算法、支付方式、折扣策略等)。,并且状态转换逻辑复杂时(如订单状态机、游戏角色状态)。(对象的状态决定行为,状态可自动切换)。如果对象的行为随状态变化而变化,用。// 上下文(Context)(如订单状态、游戏角色状态)。,状态的改变会影响对象的行为。// 上下文(Context)(客户端选择不同的算法)。

2301_81882590的博客 985

【FPGA教程案例100】深度学习1——基于CNN卷积神经网络的手写数字识别纯Verilog实现,使用mnist手写数字数据库

MNIST 数据库有一个 60,000 示例的训练集,还有一个 10,000 示例的测试集。这些数字已在大小方面规范化,在固定大小的图像中居中。如下图所示:我们任意选择0~9是个数字,将其转化为数字:0_0.txt1_0.txt2_0.txt3_0.txt4_0.txt5_0.txt6_0.txt7_0.txt8_0.txt9_0.txt。

FPGA/MATLAB学习教程/源码/项目合作开发 7829

Yield Management软件:Lam Research二次开发_(5).缺陷分析与分类方法

在半导体制造过程中,缺陷分析和分类是提高良率管理(Yield Management)的关键步骤。通过准确地识别和分类缺陷,可以更好地理解工艺过程中的问题,从而采取有效的措施来提高生产效率和产品质量。本节将详细介绍缺陷分析和分类的方法,包括缺陷检测、特征提取、分类算法及其在Lam Research软件中的应用。

2401_87715305的博客 690

Java状态模式与策略模式

什么是状态模式        定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。什么是策略模式        策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们可以相互替换,让算法独立于使用它的客户而独立变化。本人看法        同样的都是拥有父级接口,策略...

Mr杭的博客 575

【WRF-Chem教程-附录B】使用 MOZART 与WRF-Chem

使用MOZART与WRF-Chem

WW、forever的博客 242

设计模式之策略模式和状态模式(strategy pattern & state pattern)

本文来讲解一下两个结构比较相似的行为设计模式:策略模式和状态模式。两者单独的理解和学习都是比较直观简单的,但是实际使用的时候却并不好实践,算是易学难用的设计模式吧。这也是把两者放在一起介绍的原因,经过对比和实例介绍,相信应该会一些比较深刻的感知。最后在结合个人的体会简单聊一下对这两个模式的一些看法。 1. 模式概念 1.1 策略模式 运行时更改类的行为或算法,从而达到修改其功能的...

weixin_30732487的博客 362

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

状态模式和策略模式比较

说到策略模式,我们最先想到的就是商店的收银方式:不满100,正常收费;超过100不满300,超过的部分打八折;超过300,全价九折!      解决这个问题最最普通的方法就是大量的If…Else…,而它带来的就是无情的难以维护,每次条件变更都会修改原代码,严重违反了开闭原则。      显而易见,策略模式的解决方式就是封装了一系列平行且复杂的实现方式,在不同的场景下,我们选择一个最适合的方案。

劝学 7054

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

策略模式和状态模式的区别

策略模式和状态模式的类图相同,目的都是为了解耦,但是还有很多的区别 策略模式 public classs 我{ //打扮 void dressUp(); //娱乐 void entertainment(Grade grade){ grade.entertainment(); } //买车 void buyCar(); }...

小鲍侃java 963

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

状态模式和策略模式的区别

状态模式的状态可以存储上下文,策略类不关心上下文 状态模式的状态之间可以相互依赖,策略类之间相互独立 状态模式可以替换上下文中的状态(将上下文对象的状态this替换为其它状态),策略类不行 策略类处理单个特定的任务,状态类为上下文对象提供所有对应状态的实现 策略通常作为参数传递给上下文,状态可以由上下文自身创建

qq_19305529的博客 416

话说状态模式和策略模式

 图1:策略模式类图      图2:状态模式类图 熟悉uml类图的朋友,可以看出,策略模式的类图和状态模式的类图实现是很相似的,这也是为什么设计模式中,我们把这两种模式比喻成为孪生兄弟,很多时候,我们在运用上述模式来解决实际问题的时候,也经常混淆他们,其实,个人倒是认为,就算大家用法不同其实也没有必要介意,因为设计模式的应用是紧贴着设计原则来走的,不论是状

浮白 1万+

状态模式和策略模式有什么区别

它将对象的行为封装到不同的状态类中,使得对象在不同状态下可以表现出不同的行为,同时使得状态之间的切换更加简洁和可维护。策略模式:策略模式关注对象的行为的变化,并提供了一种灵活的方式来选择不同的行为或算法。状态模式:状态模式通常通过将对象的状态封装到不同的状态类中来实现。状态模式:状态模式关注对象的内部状态改变,并相应地改变对象的行为。客户端通过将不同的策略对象传递给上下文对象,来改变对象的行为。总的来说,状态模式和策略模式都提供了一种将对象行为的变化与对象本身解耦的方式,但它们的关注点、实现方式和使用。

舒一笑的博客 1000

策略模式和状态模式

策略模式 状态模式

sophie_su_su的博客 525

设计模式之策略模式和状态模式的区别

设计模式之策略模式和状态模式的区别 转策略模式与状态模式的比较 状态模式(state pattern)和策略模式(strategy pattern)的实现方法非常类似,都是利用多态把一些操作分配到一组相关的简单的类中,因此很多人认为这两种模式实际上是相同的。然而 在现实世界中,策略(如促销一种商品的策略)和状态(如同一个按钮来控制一个电梯的状态,又如手机界面中一个按钮来控制手机)是两种完全不同的思想。当我们对状态和策略进行建模时,这种差异会导致完全不同的问题。例如,对状态进行建模时,状态迁移是一个核心内容

weixin_46453756的博客 1326

状态模式和策略模式对比

状态模式和策略模式都是行为型设计模式,它们的主要目标都是将变化的行为封装起来,使得程序更加灵活和可维护。之所以将状态模式和策略模式进行比较,主要是因为两个设计模式的类图相似度较高。但是,从状态模式和策略模式的应用场景来说,两个模式存在显著的差异。

云原生Java Web领域技术博客 1654

设计模式——策略模式和状态模式

策略模式 定义:通过定义一系列的算法,并将每一个算法封装起来,可以使他们相互替换,并让算法可以在不影响到客户端的情况下变化 针对同一类型问题的多种处理方式,需要安全的封装同一类型操作时,可以使用策略模式 我们在开发中,自己曾经写过或者看到其他的开发者写过超级多if/else语句的情况,其实这是一种很烂的写法,接下来我们用一个简单的例子来说明一下,公共交通工具的计费计算,我们大部分的人很有可能就这样写了: public class Calculator { public static fin

pengbo6665631的博客 645

设计模式之状态模式和策略模式

状态模式允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。简单来说,当一个对象的内部状态发生变化时,它的行为也会随之改变。我们将每个状态对应的行为封装在一个独立的“状态”类中,而不是在一个巨大的if-else或语句中。策略模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户。简单来说,你有一个目标(例如“排序”),但有多种方法(算法)可以实现它(例如“冒泡排序”、“快速排序”)。策略模式允许你在运行时动态地选择一种方法。状态模式。

qq_37001622的博客 867

Java中,状态模式和策略模式的区别

Java开发者,要想恰当的使用状态模式和策略模式,必须清楚的理解它们之间的区别。虽然状态模式和策略模式拥有相似的结构,虽然它们都基于SOLID设计原则中的O(开闭原则),但是,它们的意图是完全不同的。 策略模式通过封装一组相关算法,为Client提供运行时的灵活性。Client可以在运行时,选择任一算法,而不改变使用算法的Context。一些流行的策略模式的例子是写那些使用算法的代码,例如加

songwenbinasdf的专栏 4089

Java设计模式之策略模式和状态模式

策略模式和状态模式是比较相同的两种设计模式,都是处理对象处在多种环境下的问题。策略模式是适用对象的某个逻辑有多种解决方案的场景,状态模式是适用一个对象内部有多种状态的场景。策略模式注重的是一个问题有多种解决方案,而状态模式注重的是对象内部自身的多种状态。

lotty_wh的博客 412
上一篇: 责任链模式(职责链模式)
下一篇: 备忘录模式
PandaCreater
博客等级 码龄6年 6粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值