Выбор между TypeScript Adapter / Facade / Proxy et c. узоры - PullRequest
0 голосов
/ 15 апреля 2020

У меня проблемы с выбором правильного шаблона для реализации. Основная идея заключается в использовании одного экземпляра класса, вызывающего одни и те же методы для достижения одинаковых результатов. Стоит ли использовать Адаптер / Фасад / Прокси или что-то еще? Должен ли я заменить 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?).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...