javascript — альтернатива для шаблона посетителя в TypeScript (избегая экземпляров условных выражений)

Альтернатива для шаблона посетителя в TypeScript (избегая экземпляров условных выражений)

Давайте предположим, что у меня есть интерфейс

 interface I {amp}lt;T extends InternalResult{amp}gt; { doStuff(): T; } 

и два конкретных класса, реализующих этот интерфейс:

 class A implements I {amp}lt;InternalAResult{amp}gt; { doStuff(): InternalAResult { // implementation } } class B implements I {amp}lt;InternalBResult{amp}gt; { doStuff(): InternalBResult { // implementation } } 

Мой клиент не может выполнить doStuff() напрямую, но ему нужен экземпляр класса, реализующий интерфейс Executer , например, один из них:

 interface Executer {amp}lt;T, R{amp}gt; { execute(it: T): R; } class AExecuter implements Executer {amp}lt;A, AResult{amp}gt; { execute(it: A): AResult { let internalResult = it.doStuff(); // ... do something specific with internalResult create result return result; } } class BExecuter implements Executer {amp}lt;B, BResult{amp}gt; { execute(it: B): BResult { let internalResult = it.doStuff(); // ... do something other specific with internalResult create result return result; } } 

Для таких случаев я всегда использовал шаблон Visitor в Java. Я мог бы создать посетителя, передать ему два экземпляра Executer и реализовать метод visit с перегрузкой A и B , создав безусловное решение, например:

 class Visitor { private aExecuter: AExecuter; private bExecuter: BExecuter; visit(it: A): Result { return this.aExecuter.execute(it); } visit(it: B): Result { return this.bExecuter.execute(it); } } 

Теперь в TypeScript / JavaScript нет такой вещи, как перегрузка методов. Но какая альтернатива созданию условного подобного?

 if (it instanceof A) aExecuter.execute(it); else if (it instanceof B) bExecuter.execute(it); 

Примечание. Я хочу, чтобы класс A ничего не знал об AExecuter . Это увеличило бы связь между этими двумя классами, и я не мог легко переключить реализацию AExecutor .

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector