У меня проблемы с выбором правильного шаблона для реализации. Основная идея заключается в использовании одного экземпляра класса, вызывающего одни и те же методы для достижения одинаковых результатов. Стоит ли использовать Адаптер / Фасад / Прокси или что-то еще? Должен ли я заменить extends на инвентарь ? Существует ли общий или рекомендуемый шаблон для этого в TypeScript?
Абстрактный класс:
abstract class InformerBasic {
abstract getImageDimensions(path: string): null | { height: number; width: number };
public whatWeHave(path: string): null | { height: number; width: number } {
// More magic here
// Only this should be called
return this.getImageDimensions(path);
}
}
Расширенные классы
class InformerLocalFileSystem extends InformerBasic {
public getImageDimensions(path: string): { height: number; width: number } {
// Simple local system code
return { height: 200, width: 200 }; // Actual unique code must be here
}
}
class InformerCloudDropBox extends InformerBasic {
public getImageDimensions(path: string): { height: number; width: number } {
// Complex cloud / network here
return { height: 200, width: 200 }; // Actual unique code must be here
}
}
Используемый класс
class Informer extends InformerBasic {
protected implementation;
public constructor(instance: InformerBasic) {
super();
this.implementation = instance;
}
public getImageDimensions(path: string): { height: number; width: number } {
return this.implementation.getImageDimensions(path);
}
}
Использование
const instanceOfLocal = new InformerLocalFileSystem();
const informerLocal = new Informer(instanceOfLocal);
console.log(informerLocal.whatWeHave("/path/to/image"));
const instanceOfDropBox = new InformerCloudDropBox();
const informerDropBox = new Informer(instanceOfDropBox);
console.log(informerDropBox.whatWeHave("/path/to/image"));
Обновление 1 Ну, это просто простой пример. Это НЕ фактический код. Я просто хотел написать как можно меньше кода, чтобы облегчить понимание вопроса.
Обновление 2 ОК. Раунд 2. Реализация. 1. Мы должны создать экземпляр объекта. Без него невозможно написать:
class InformerCloud extends InformerBasic {}
const i = new Informer(new InformerCloud());
Я бы хотел
class InformerCloud extends InformerBasic {}
const i = new Informer(InformerCloud, {login, pass, etc});
Но я не знаю, как это реализовать. Должен ли конструктор принимать имя класса как Тип функции ?
public constructor(FromClass: Function) {
super();
this.implementation = new FromClass();
}
Оба InformerCloud И Informer расширяет InformerBasi c. Это приведет к путанице. Что именно и случилось. Как это исправить?
Невозможно задержать выполнение. Когда мы создаем экземпляр, он становится заложником Informer.implementation . Я хотел бы создать экземпляр при первом вызове метода или вообще не создавать экземпляр (Service Locator?).