Javascript:接口和 DTO

ria*_*mri 7 javascript oop

我正在寻找在 javascript 中模拟接口和 DTO 来解决这个问题。一个对象 dto、一个对象调用者以及同一接口 IWorker 的不同实现。

调用者将接收一个 dto 进行实例化,将向其提供用户输入,然后调用 Iworker 的正确实现(方法执行)。

我希望在我的代码中只有一个 dto 实例和一个调用者实例,这样每次用户做出另一种选择时我就可以调用 caller.CallWorker()

请告诉我这个想法是否好,欢迎使用 javascript 实现

多谢

编辑:感谢您的帮助,将采取 Bergi 解决方案,但我还需要一件事 所以我的实现将是这样的:

var caller = {
    callWorker: function(obj) {
        if(obj.id == 1)  Worker1.execute();
        if(obj.id == 2)  Worker2.execute();
        if(obj.id == 2)  Worker3.execute();
    }
};
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须在 html 页面中添加所有工作定义(每个实现一个 js 脚本)。我只想动态添加脚本,实际上活动工作人员依赖于很多业务逻辑,因此我将动态包含它们以在页面中仅包含活动工作人员。你建议我怎么做?caller.callworker 中的所有条件都满足吗?或者有更优雅的方法。

Ber*_*rgi 7

\n

我正在寻找模拟界面

\n
\n\n

动态类型语言 JavaScript 中没有“接口”,也没有类。最近的模拟是一个检查给定对象是否具有一组特定方法的函数;但它无法进行任何类型或功能测试。

\n\n
\n

和DTO

\n
\n\n

最接近 DTO 的是 JSON 可序列化对象。这意味着它没有循环,不包含Date对象,甚至不包含宿主对象。

\n\n
\n

我希望在我的代码中只有一个 dto 实例和一个调用者实例,这样每次用户做出另一种选择时我就可以调用 caller.CallWorker()

\n
\n\n

这是另一种设计模式:单例模式。它们可以轻松地用 JS 进行编码,因为对象可以动态创建,并且不需要需要防止多次实例化的类和构造函数。只需对它们使用对象文字即可。

\n\n
\n

欢迎任何 JavaScript 实现

\n
\n\n

这只是一个简单的示例,但您可以在需要的地方扩展它:

\n\n
function makeDTO(id) {\n    // creates a basic data structure, with empty or default values or from parameters\n    return {\n        id: id,\n        userInput: [],\n        validate: false,\n        \xe2\x80\xa6\n    };\n}\nvar caller = {\n    callWorker: function(obj) {\n        // do something\n    }\n};\n\nvar dto = makeDTO(14);\ncaller.callWorker(dto);\nvar asString = JSON.stringify(dto);\n
Run Code Online (Sandbox Code Playgroud)\n\n
\n

或者有更优雅的方法。

\n
\n\n

让工人成为数组或对象。例如

\n\n
var workers = {\n    1: {/* std worker #1 */},\n    \xe2\x80\xa6\n};\n// then the caller will look like this:\nvar caller = {\n    callWorker: function(obj) {\n        var workerName = obj.id; // just the id? Or something more complex\n        if (workerName in workers)\n            workers[workerName].execute(obj);\n        else\n            dynamicallyLoadWorker(workerName, function callbackWhenLoaded(worker) {\n                workers[workerName] = worker;\n                worker.execute(obj);\n            });\n    }\n};\n
Run Code Online (Sandbox Code Playgroud)\n