JavaScript中是否存在松散耦合对象的模式。

时间:2016-09-30 10:28:45

标签: javascript design-patterns

我对JavaScript比较新,所以如果这类问题显而易见,请道歉。

我们有一个应用程序,它使用etcd作为存储数据的方式。我想要做的是实现一种在不同后端数据存储之间交换或交替的方式(我想要使用dynamodb)。

我来自C#背景,所以如果我要在asp.net应用程序中实现这种行为,我会使用接口和依赖注入。

我能想到的最佳解决方案是让工厂根据某些配置设置返回数据存储对象。我知道TypeScript有接口,但如果可能的话,我更愿意坚持使用vanilla js。

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:0)

我来自Delphi / C#等。接口只是一个痛苦但是。 Javascript非常好..

不需要javascript接口,只需添加方法即可。

例如

function MyBackend1() {
   this.ver = 'myBackEnd1';
}

function MyBackend2() {
   this.ver = 'myBackEnd2';
   this.somefunc = function () { console.log('something'); }
}

function run(backend) {
   console.log(backend.ver);
   //below is like an interface supports
   if (backend.somefunc) backend.somefunc();
}

run(new MyBackend2());
//lets now use backend1
run(new MyBackend1());

答案 1 :(得分:0)

接口“仅仅”是实现多态性的静态类型测量。由于Javascript没有任何静态类型系统,因此它也没有接口。但是,它本身就是一种高度多态的语言。所以你想做的事情是微不足道的;只是不要在过程中编写任何接口:

function StorageBackend1() { }
StorageBackend1.prototype.store = function (data) {
    // here be dragons
};

function StorageBackend2() { }
StorageBackend2.prototype.store = function (data) {
    // here be other dragons
};

function SomeModel(storage) {
    this.storage = storage;
    this.data = {};
}
SomeModel.prototype.saveData = function () {
    this.storage.store(this.data);
};

var m1 = new SomeModel(new StorageBackend1),
    m2 = new SomeModel(new StorageBackend2);

m1.saveData();
m2.saveData();

使用TypeScript和实际的interface可以让您在运行时获得静态类型检查语言的可靠性,并且可以减少可能出现的意外,但是您不需要它来实现多态性。