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())
}
}