状态模式----pk------策略模式

本文通过具体实例对比了状态模式和策略模式的区别。状态模式适用于对象状态改变导致行为变化的场景,关注状态的转移顺序;策略模式则用于在运行时选择算法,允许算法独立于使用它的对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近学习设计模式,在看到状态模式和策略模式的时候,将其二者搞混,两者的UML图很像。

所以查找资料,翻阅文档  终于将二者分清。下面就聊聊二者的区别。

先来看状态模式的一个实例:

        做饭,有三种状态:      time<=10  未做熟

                                                  time<=20   熟了

                                                  time>20    烧糊了

        状态类接口:

public interface State {
	
	public void  boil(int time,make people);

}
/**
 * 为做熟的状态
 * @author John
 *
 */


public class UnderCooked implements State{

	
	@Override
	public void boil(int time, make make) {
		// TODO Auto-generated method stub
	  if(time>10){
		  make.setState(new Cooked());
	  }else
	 	  System.out.println("烧烤"+time+"分钟,食物还未熟");

	}

}

/**   食物熟了
 * @author John
 *
 */
public class Cooked implements State {

 
	@Override
	public void boil(int time, make make) {
		// TODO Auto-generated method stub
		if(time>20){
			make.setState(new OverCook());
		}else
			System.out.println("烧烤"+time+"分钟,食物已经熟了,可以吃了");

 	}

}
/**
 * 食物烧糊了
 * @author John
 *
 */
public class OverCook implements State {

	@Override
	public void boil(int time, make make) {
		// TODO Auto-generated method stub
         System.out.println("烧烤"+time+"分钟,食物已经烧黑了,不能吃了");
	}

}



策略模式:

    两个数的运算

         

public interface Compute {
	public   int  count(int a,int b);

}
加的算法

public class plus implements Compute {
    
	@Override
	public int count(int a,int b) {
		// TODO Auto-generated method stub
		return a+b;
	}

}

乘的算法

public class multiply implements Compute {

	@Override
	public int count(int a, int b) {
		// TODO Auto-generated method stub
		return a*b;
	}

}

辅助类

public class Context {
	private Compute  com;
	public  Context(){
		
	}
	public  Context(Compute  com){
		this.com=com;
	}
	public  void  setCom(Compute com){
		this.com=com;
	}
	int a=1;
	int b=3;
	public void  count(){
	
		System.out.println(com.count(a, b));
		
	}

}

客户端

public class client {
	public static void  main(String args[]){
		//相加
		Context  context=new Context();
		context.setCom(new plus());
		
		
		context.count();
		
		//相乘
		
		context.setCom(new multiply());
		context.count();
	}

}

从上面的代码及UML图可以看出两个模式结构大致相同

我感觉二者最大的区别就是:

      状态模式很好的定义了状态的转移次序,而策略模式则不需要,它可以在client端任意调用算法


### VINS-Mono 初始化代码解析 VINS-Mono 是一种基于单目视觉和惯性测量单元 (IMU) 的同步定位与建图 (SLAM) 系统。其初始化过程旨在通过融合相机观测数据和 IMU 数据来估计系统的初始状态,包括重力方向、尺度以及位姿等参数。 #### 初始状态估计 在 VINS-Mono 中,初始化阶段的核心目标是从传感器数据中提取足够的约束条件以完成系统校准。具体而言: 1. **重力向量估计** 使用加速度计的原始读数计算重力矢量的方向。由于加速度计存在噪声和偏差,在实际应用中通常采用低通滤波器平滑信号并减少高频干扰[^1]。随后通过对多个时间戳上的加速度值求平均进一步提高精度。 2. **姿态角解算** 基于上述得到的重力分量,利用四元数表示法构建旋转矩阵从而确定设备的姿态角度。此部分涉及复杂的三角函数运算及数值稳定性考量[^2]。 3. **尺度恢复机制** 单目摄像头无法直接提供绝对距离信息,因此需借助特定几何结构或运动模式实现尺度还原。例如当物体沿直线路径移动时,可以通过连续帧间特征点对应关系推导真实世界比例因子[^3]。 #### 数学模型建立 为了描述整个物理现象,定义如下变量集合 {q, v, p} 表征刚体位置、线速度及其相对于全局坐标系下的定向;同时引入辅助项 b_a 和 b_g 来分别刻画加速计偏移量与陀螺仪漂移情况。最终形成的状态转移方程组可表达为差分形式: ```python def state_transition(q_k_minus_1, v_k_minus_1, p_k_minus_1, ba_k_minus_1, bg_k_minus_1, acc_bias, gyro_bias, dt): # 更新姿态 qk dq = quaternion_from_angular_velocity(gyro - bg_k_minus_1, dt) q_k = normalize(quaternion_multiply(dq, q_k_minus_1)) # 计算当前时刻加速度 ak a_body = rotate_vector_by_quaternion(acc - ba_k_minus_1 - gravity_in_world_frame(), inverse(q_k)) # 更新速度 vk 及位置 pk v_k = v_k_minus_1 + a_body * dt p_k = p_k_minus_1 + v_k_minus_1 * dt + 0.5 * a_body * (dt ** 2) return q_k, v_k, p_k, ba_k_minus_1, bg_k_minus_1 ``` 以上伪码片段展示了如何依据前一采样周期内的已知量预测下一瞬间的新值,并考虑了各种误差源的影响因素。 #### 特殊场景处理策略 针对可能出现的异常状况比如剧烈晃动或者光照突变等情况,算法设计了一系列鲁棒性强的技术手段予以应对。其中包括但不限于: - 动态调整窗口大小以便更好地捕捉快速变化的动作特性; - 应用 RANSAC 随机抽样一致性方法剔除离群点干扰; - 结合地图拼接技术完成大范围环境探索后的重新定位操作。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值