объектно-ориентированное программирование: еще один способ реализации паттерна состояний?
Мне нужна помощь с другим решением в этом
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());