объектно-ориентированное программирование: еще один способ реализации паттерна состояний?

Мне нужна помощь с другим решением в этом Object-oriented designвызов! Технический руководитель попросил меня дать другое решение.

Это вызов:

Армия состоит из частей. Отряд может быть копейщиком, лучником или рыцарем. Из пикинера можно превратить в лучника; лучник может быть превращен в рыцаря, а рыцарь не может быть преобразован.

Это было моим решением:

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

Хотя технический руководитель спросил меня, есть ли другой способ реализовать transform вместо возврата нового объекта.

Может ли кто-нибудь помочь мне найти новое решение?

1 ответ

Вот как бы я это сделал. Надеюсь, это решит вашу проблему.

         const PIKEMAN = 0;
    const ARCHER = 1;
    const KNIGHT = 2;


    class Unit {
      // list of possible type of units, ordered by its hierarchy
      types = ["pikeman", "archer", "knight"];
      
      // current type of the unit
      current_type = 0;
      
      constructor(type = PIKEMAN){
        // by default, unit type is a pikeman 
        this.current_type = type;
      }
      
      transform(){
        // try to check, if it has a next hierarchy or not,
        let nextType = this.current_type + 1;
        
        // if its possible to transform it into the next unit type, then transform it
        if (this.types[nextType]) {
          this.current_type++;
          
          // return back the instance
          return this;
        }
        
        // get its current type on what unit this is.
        const currentType = this.types[ this.current_type ];
        
        // throw that i cannot be transformed anymore
        throw new Error("A "+currentType+" cannot be transformed")
      }
      
    }


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


    let army = new Army([
      new Unit(PIKEMAN),  
      new Unit(ARCHER)
    ]);

    console.log(army.transformUnits());

Другие вопросы по тегам