Router
// 팩토리
const Operator = class {
static factory(v){
if (v instanceof Object) {
if (!Array.isArray(v)) v = Object.values(v);
return new ArrayOp(v.map(v => Operator.factory(v)));
}else return typeof v === "string" ? new StringOp(v) : new PrimaOp(v);
}
constructor(v) {this.v = v;}
operation(f) {throw 'override';}
};
// 컴포지트
const StringOp = class extends Operator{
constructor(v) {super(v);}
operation(f){for (const a of this.v) f(a)}
}
const PrimaOp = class extends Operator{
constructor(v) {super(v);}
operation(f){f(this.v);}
}
const ArrayOp = class extends Operator {
constructor(v) {super(v);}
operation(f){for (const v of this.v) v.operation(f);}
}
Operator.factory([1,2,3, {a:'abc', b:5}, 6, 7]).operation(console.log);
// 1
// 2
// 3
// a
// b
// c
// 5
// 6
// 7
위에선 로직이 복잡하게 있어서 별도로 선택하는 Factory 가 필요했다.
하지만 이걸 일반적으로도 선택할 수 있게 할 수 있다.
그것이 라우터이다.
위 코드에선 일반화된 라우터를 할 수 없다.
값을 동적으로 여러가지로 평가하고 있기 때문이다.
이런 경우엔 팩토리를 활용해야된다.