Javascript 面向对象编程:实现状态模式的另一种方法?

Javascript 面向对象编程:实现状态模式的另一种方法?,javascript,oop,state-pattern,Javascript,Oop,State Pattern,在这个面向对象设计挑战中,我需要另一个解决方案的帮助!技术负责人让我给出另一个解决方案 这就是挑战: 军队是由部队组成的。一个单位可以是枪兵、弓箭手或骑士。枪兵可以变成弓箭手;弓箭手可以变成骑士,而骑士则不能 这就是我的解决方案: 尽管技术负责人问我是否有其他方法来实现transform方法,而不是返回新对象 有人能帮我找到一个新的解决方案吗?以下是我该怎么做。我希望它能解决你的问题 const PIKEMAN=0; const-ARCHER=1; 常数骑士=2; 班级单位{ //可能的单元类

在这个
面向对象设计挑战中,我需要另一个解决方案的帮助!技术负责人让我给出另一个解决方案

这就是挑战:

军队是由部队组成的。一个单位可以是枪兵、弓箭手或骑士。枪兵可以变成弓箭手;弓箭手可以变成骑士,而骑士则不能

这就是我的解决方案:

尽管技术负责人问我是否有其他方法来实现
transform
方法,而不是返回新对象


有人能帮我找到一个新的解决方案吗?

以下是我该怎么做。我希望它能解决你的问题

const PIKEMAN=0;
const-ARCHER=1;
常数骑士=2;
班级单位{
//可能的单元类型列表,按其层次结构排序
类型=[“枪兵”、“弓箭手”、“骑士”];
//单元的当前类型
当前_类型=0;
建造师(类型=枪兵){
//默认情况下,单位类型为枪兵
this.current_type=type;
}
变换(){
//尝试检查是否有下一个层次结构,
设nextType=this.current\u type+1;
//如果可以将其转换为下一个单元类型,则转换它
if(this.types[nextType]){
这个.current_type++;
//返回实例
归还这个;
}
//获取它的当前类型,它是什么单位。
const currentType=this.types[this.current_type];
//我不能再被改变了
抛出新错误(“无法转换“+currentType+”)
}
}
阶级军队{
构造函数(单位=[]){
this.units=单位//单位的集合
}
添加单位(单位){
这个。单位。推(单位);
}
转换单元(){
返回此.units.map(u=>u.transform())
}
}
让军队=新军([
新部队(枪兵),
新单位(弓箭手)
]);

console.log(army.transformUnits())将枪兵、弓箭手或骑士视为同一对象的不同状态。然后你的
变换将被更新而不是创建。除了变换,这些
单位
对象还能做什么?单位可以
训练
,但我认为这不是重点。你认为这有帮助吗?谢谢你的解决方案!虽然我正在寻找一种解决方案,它采用子类而不是使用类型为的变量!哦,好的,你在标题中提到了,“状态模式”,我相信它在转换为其他类型时处理单元类型。如果您仍在寻求不同的解决方案,我将尝试提出子类方法。
class Unit {}

class Pikeman extends Unit {
  transform() {
    return new Archer();
  }
}

class Archer extends Unit {
  transform() {
    return new Knight();
  }
}

class Knight extends Unit {
  transform() {
    throw new Error('a Knight can not be transformed');
  }
}

class Army {
  constructor() {
    this.units = [] // a collection of units
  }
  addUnit(unit) {
     units.push(unit);
  }
  
  transformUnits(units) {
     var unitsTransformed = units.map(u => u.transform())
  }
}