For*_*eti 7 javascript strategy-pattern node.js
我有一个类层次结构,如:
|-> Square
AbstractShape -+-> Circle
|-> Triangle
Run Code Online (Sandbox Code Playgroud)
现在,我想实现策略模式并创建一个存储在字符串中的类对象.在PHP中我会使用:
$type = 'Square';
$obj = new $type();
Run Code Online (Sandbox Code Playgroud)
Node.js中有等价物吗?
一种安全的方法是定义工厂对象:
function Square() {
}
// here other constructors for Circle and Triangle
var factory = {
"Square": Square,
"Circle": Circle,
"Triangle" : Triangle
}
var typeName;
// here some code which sets typeName
var typeObj = new factory[typeName]();
Run Code Online (Sandbox Code Playgroud)
如果您希望采用更强大且可测试的方法,则可以使用类和工厂模式的组合来发布对象.查看以下内容,您将看到,通过此设置,包括更精细的逻辑和测试将更容易,并为您提供更大的灵活性.你也是在.issue
电话背后自己抽象出对象- 这在某些情况下可能是有益和方便的.
我还注意到你提到了你的PHP背景,所以我还展示了一些如何在ES6中采用面向对象的方法.
class AbstractShape {
constructor(type) {
this.type = type;
}
getType() {
console.log(`I am a ${this.type}`);
}
}
class Square extends AbstractShape {
constructor(type) {
super(type);
this.sides = 4;
}
getDescription() {
console.log(`I have ${this.sides} equal sides`);
}
}
class ShapeFactory {
static issue(type) {
switch(type) {
case 'Square': return new Square(type);
break;
case 'Circle': /* same pattern with a Circle class */
break;
}
}
}
let shape = ShapeFactory.issue('Square');
shape.getType(); /* I am a Square */
shape.getDescription(); /* I have 4 equal sides */
Run Code Online (Sandbox Code Playgroud)
JSFiddle Link - 演示
此外,如果你想要比处理冗余字符串更容错一些东西,例如'Square'
- 有一些创造性的方法来利用类似枚举的方法,可以进一步改进这一点.我将在这里保存房地产而不是重新哈希代码片段,但会包含一个小提琴供您查看.
JSFiddle Link - 枚举方法演示