09 状态,适配器

本文深入探讨了状态模式的关键概念,通过电灯开关的例子详细解释了如何将事物的不同状态封装成独立类,以及状态改变带来的行为变化。进一步比较了状态模式与策略模式的区别,并提供了JS版本的状态机器实现。最后通过Marry状态的实例展示了状态模式的应用,以及与策略模式的对比。

状态模式

  • 状态模式的关键是把事物的每种状态都封装成单独的类,跟此种状态有关的行为都被封装在这个类内部;当内部状态改变时,会带来不同的行为变化;
电灯开关的例子
var offLightState = function(light) {
  this.light = light;
};
offLightState.prototype.buttonWasPressed = function() {
  console.log('weakLightState');
  this.light.setState(this.light.weakLightState);
};
var weakLightState = function(light) {
  this.light = light;
};
weakLightState.prototype.buttonWasPressed = function() {
  console.log('strongLightState');
  this.light.setState(this.light.strongLightState);
};
var strongLightState = function(light) {
  this.light = light;
};
strongLightState.prototype.buttonWasPressed = function() {
  console.log('offLightState');
  this.light.setState(this.light.offLightState);
};

var Light = function() {
  this.offLightState = new offLightState(this);
  this.weakLightState = new weakLightState(this);
  this.strongLightState = new strongLightState(this);
  this.button = null;
};
Light.prototype.init = function() {
  var button = document.createElement('button');
  self = this;
  this.button = document.body.appendChild(button);
  this.button.innerHTML = '开关';
  this.currState = this.offLightState;
  this.button.onclick = function() {
    self.currState.buttonWasPressed();
  }
};
Light.prototype.setState = function(newState) {
  this.currState = newState;
};

var light = new Light();
light.init();
JS版本的状态机器
  • JS是无类的,没有规定让状态对象一定要从类中创建而来;此外JS可以非常方便地使用委托技术,并不需要要事先让一个对象持有另一个对象;
var delegate = function(client, delegation) {
  return {
    buttonWasPressed: function() {
      return delegation.buttonWasPressed.apply(client, arguments);
    }
  }
};

var FSM = {
  off: {
    buttonWasPressed: function() {
      console.log('on');
      this.currState = this.onState;
    }
  },
  on: {
    buttonWasPressed: function() {
      console.log('off');
      this.currState = this.offState;
    }
  }
};

var Light = function() {
  this.offState = delegate(this, FSM.off);
  this.onState = delegate(this, FSM.on);
  this.button = null;
};
Light.prototype.init = function() {
  var button = document.createElement('button');
  self = this;
  this.button = document.body.appendChild(button);
  this.button.innerHTML = '开关';
  this.currState = this.offState;
  this.button.onclick = function() {
    self.currState.buttonWasPressed();
  }
};

var light = new Light();
light.init();
另一个例子
var MarryState = function () {
  var _currentState = {};
  var states = {
    jump: function () {
      console.log('jump');
    },
    move: function () {
      console.log('move');
    },
    shoot: function () {
      console.log('shoot');
    },
    squat: function () {
      console.log('squat');
    }
  };
  var Action = {
    changeState: function () {
      var arg = arguments;
      _currentState = {};
      if(arg.length) {
        for(var i = 0, l = arg.length; i < l; i++) {
          _currentState[arg[i]] = true;
        }
      }
      return this;
    },
    gose: function () {
      console.log('gose');
      for(var i in _currentState) {
        states[i] && states[i]();
      }
      return this;
    }
  };
  return {
    change: Action.changeState,
    gose: Action.gose
  }
} 
var marry = new MarryState();
marry.change('jump', 'shoot').gose().gose()
  .change('shoot').gose();
状态模式和策略模式
  • 相同点是都有一个上下文,一些策略或者状态类,上下文吧请求委托给这些类来执行;
  • 区别是策略模式中各个策略类之间是平等又平行的,他们之间没有任何联系;客户必须熟知这些策略类的作用以便随时主动切换算法;
  • 状态模式中,状态和状态对应的行为是早已封装好的,之间的切换也是规定好的,改变行为发生在状态模式内部;客户并不需要了解这些细节;
对于分支优化
  • 工厂方法模式: 创建性模式,目的是创建对象;
  • 状态模式: 行为性模式,核心是对象状态的控制来决定表现行为,状态之间不能替换;
  • 策略模式: 行为性模式,核心是算法,由于每种算法处理的业务逻辑相同,可以互相替换;

适配器模式

  • 将一个类(对象)的接口转化为另一个接口,解决接口不匹配的问题;
  • 设计之初不会考虑,用于补救的模式;

适配异类框架

参数适配

function doSomeThing(obj) {
  var _adapter = {
    name: 'jinks',
    titile: 'enginner',
    age: 24,
    ....
  }
  for(var i in _adapter) {
    _adapter[i] = obj[i] || _adapter[i];
  }
  //doSome
}

数据适配

  • 将数组转化为易于理解的对象格式;
  • 服务器与客户端接口数据的适配;

转载于:https://www.cnblogs.com/jinkspeng/p/4616765.html

<think>好的,我现在需要解决用户提出的ESXi存储适配器状态显示为未知的问题。首先,我需要了解存储适配器状态未知的可能原因。根据用户的引用内容,特别是引用[1]提到的APD状况,当所有路径都出现故障时,ESXi主机会持续尝试重新连接,可能导致存储适配器状态异常。此外,引用[3]提到驱动程序问题也可能导致设备地址不匹配,进而影响存储适配器的识别。 接下来,我应该分步骤考虑解决方案。首先检查物理连接,确保线缆和HBA卡正常工作。然后查看存储适配器的日志,寻找错误信息,可能涉及驱动问题或硬件故障。如果驱动有问题,可能需要更新或重新安装,特别是引用[3]提到的nmlx5_core或nvme_pcie驱动在ESXi 7.0及以下版本的问题。此外,检查存储阵列的状态,确认LUN是否正确配置,并验证多路径设置是否正常。如果问题持续,可能需要重启主机或重新扫描存储适配器。最后,如果以上步骤无效,联系VMware支持或硬件供应商进一步诊断。 还需要考虑用户提到的引用[4],关于vSphere HA的保护机制,虽然这可能不直接解决存储适配器问题,但可以建议用户启用VMCP来防止数据存储可访问性问题。同时,引用[2]虽然涉及VMware Tools升级的问题,但可能与当前问题无关,可以暂时忽略。 总结可能的解决方案步骤:检查物理连接、查看日志、更新驱动、验证存储配置、重启服务或主机、联系支持。需要确保每个步骤清晰,并参考相关引用内容来支持建议的可靠性。</think>### ESXi存储适配器状态未知的解决方案 当ESXi存储适配器显示“状态未知”时,通常由硬件连接异常、驱动问题或存储配置错误导致。以下是逐步排查与解决方法: --- #### **1. 检查物理连接与硬件状态** - **步骤**:确认存储适配器(如HBA卡)的物理连接(光纤/SAS线缆)是否松动或损坏,存储设备(如SAN/NAS)电源与网络状态正常。 - **关联问题**:APD状况可能因物理链路中断引发,ESXi会持续重连但无法恢复[^1]。 --- #### **2. 查看存储适配器日志** - **步骤**:通过ESXi Shell或vCenter查看日志: ```bash tail -f /var/log/vmkernel.log | grep -i "storage adapter" ``` - **目标**:检查是否存在驱动错误(如`nmlx5_core`或`nvme_pcie`驱动不兼容[^3])或硬件超时记录。 --- #### **3. 更新或重新安装驱动** - **步骤**: 1. 访问VMware兼容性指南(VMware Compatibility Guide),确认存储适配器驱动版本与ESXi版本匹配。 2. 通过ESXi主机更新管理器或手动安装驱动: ```bash esxcli software vib update -n <驱动名称> ``` - **注意**:ESXi 7.0及以下版本的特定驱动(如引用[3])需优先检查兼容性。 --- #### **4. 验证存储阵列配置** - **步骤**: 1. 登录存储管理界面,确认LUN已正确映射到ESXi主机。 2. 检查多路径策略(如VMware PSA配置),确保路径冗余正常。 - **示例命令**: ```bash esxcli storage nmp device list # 查看存储设备多路径状态 ``` --- #### **5. 重启存储适配器服务** - **步骤**: 1. 重启存储相关服务: ```bash services.sh restart ``` 2. 重新扫描适配器: ```bash esxcli storage core adapter rescan --all ``` --- #### **6. 主机重启与固件升级** - **步骤**:若上述步骤无效,尝试重启ESXi主机,并升级存储适配器固件至最新版本。 --- #### **7. 联系VMware支持** - **适用场景**:若问题仍未解决,提供`vmkernel.log`和`vmware.log`给VMware支持,排查是否为已知Bug或硬件缺陷。 --- #### **附加建议** - **启用VMCP保护**:通过vSphere HA的VM组件保护(VMCP),可在存储故障时自动迁移虚拟机[^4]。 - **定期检查硬件兼容性**:避免因驱动或固件不匹配导致状态异常。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值