Modelli di progettazione: modello di comando in TypeScript

Separare il chiamante e il destinatario e appianare le differenze tra i diversi ricevitori. Consente di aggiungere facilmente diversi comandi per aggiungere diverse funzioni.

Foto di hannah joshua su Unsplash

Benvenuti nella serie Design Patterns in TypeScript , che introduce alcuni utili modelli di progettazione nello sviluppo web utilizzando TypeScript.

9 modelli di progettazione che ogni ingegnere dovrebbe conoscere

I modelli di progettazione sono molto importanti per gli sviluppatori Web e possiamo scrivere codice migliore padroneggiandoli. In questo articolo, userò TypeScript per introdurre il modello di comando.

Su iOS e macOS, è presente un'applicazione Scorciatoie integrata. Con questo programma, gli utenti possono eseguire rapidamente 1 o più attività. Ad esempio, attività come l'invio rapido di messaggi, la traduzione di testo, l'abbreviazione di URL e il download di file.

Successivamente, implementiamo un'applicazione simile. Nel codice seguente, definiamo una Shortcutsclasse, in cui creiamo 5 metodi membro come openUrl, shortenUrl, sendMessage, ecc.

class Shortcuts {
  openUrl(url: string) {
    console.log(`Open url: ${url}`);
  }
  shortenUrl(url: string) {
    console.log(`Shorten url: ${url}`);
  }
  sendMessage(msg: string) {
    console.log(`Send message: ${msg}`);
  }
  translateText(originText: string) {
    console.log(`Translate text: ${originText}`);
  }
  downloadFile(fileUrl: string) {
    console.log(`Download file: ${fileUrl}`);
  }
}

class UIEventHandler {
  constructor(public shortcuts: Shortcuts) {}

  handleAction(action: ShortcutsMethods, arg: string) {
    this.shortcuts[action](arg);
  }
}

// "openUrl" | "shortenUrl" | "sendMessage" | "translateText" | "downloadFile"
type ShortcutsMethods = Methods<Shortcuts>;

type Methods<T> = {
  [P in keyof T]: T[P] extends (...args: any) => void ? P : never;
}[keyof T];

Con la UIEventHandlerclasse, possiamo usarlo nel modo seguente:

const shortcuts = new Shortcuts();
const eventHandler = new UIEventHandler(shortcuts);

eventHandler.handleAction("openUrl", "https://medium.com/@bytefer");
eventHandler.handleAction("sendMessage", "Hello Bytefer!");

  • Quando chiamiamo il handleActionmetodo, dobbiamo assicurarci che il actionnome sia coerente con il nome del metodo nella Shortcutsclasse.
  • Con il continuo aumento delle funzioni, ci saranno sempre più metodi corrispondenti nella Shortcutsclasse. Di conseguenza, dobbiamo modificare costantemente la Shortcutsclasse.

In effetti, possiamo racchiudere attività come l'invio di messaggi, la traduzione di testo e l'accorciamento di URL in singoli comandi.

interface Command {
  name: string;
  execute(args: any): any;
}

class OpenUrlCommand implements Command {
  name = "openUrl";
  execute(args: any) {
    console.log(`Open url: ${args[0]}`);
  }
}

class SendMessageCommand implements Command {
  name = "sendMessage";
  execute(args: any) {
    console.log(`Send message: ${args[0]}`);
  }
}

class CommandManager {
  commands: Record<string, Command> = {};

  registerCommand(name: string, command: Command) {
    this.commands[name] = command;
  }

  executeCommand(command: string | Command, ...args: any) {
    if (typeof command === "string") {
      this.commands[command].execute(args);
    } else {
      command.execute(args);
    }
  }
}

class UIEventHandler {
  constructor(public cmdManager: CommandManager) {}
  handleAction(command: string | Command, arg: string) {
    this.cmdManager.executeCommand(command, arg);
  }
}

const commandManager = new CommandManager();
commandManager.registerCommand("openUrl", new OpenUrlCommand());
commandManager.registerCommand("msg", new SendMessageCommand());

const eventHandler = new UIEventHandler(commandManager);
eventHandler.handleAction("openUrl", "https://medium.com/@bytefer");
eventHandler.handleAction("msg", "Hello Medium!");
eventHandler.handleAction(new SendMessageCommand(), "Hello Bytefer!");

Open url: https://medium.com/@bytefer
Send message: Hello Medium!
Send message: Hello Bytefer!

Infine, riassumiamo gli scenari di utilizzo del modello di comando:

  • Quando è necessario astrarre varie azioni di esecuzione, vengono utilizzati diversi parametri per determinare quale azione eseguire.
  • Il sistema deve disaccoppiare il chiamante della richiesta e il destinatario della richiesta in modo che il chiamante e il destinatario non interagiscano direttamente. Il chiamante della richiesta non ha bisogno di conoscere l'esistenza del destinatario, né ha bisogno di sapere chi sia il destinatario, e il destinatario non deve preoccuparsi quando viene chiamato.

Se vuoi imparare TypeScript, non perderti la serie Mastering TypeScript .

Con oltre 30 articoli, non sarai confuso quando impari il dattiloscritto

Codifica di livello superiore

Grazie per far parte della nostra comunità! Prima che tu vada:

  • Batti le mani per la storia e segui l'autore
  • Visualizza altri contenuti nella pubblicazione Level Up Coding
  • Seguici: Twitter | Linkedin | Notiziario

Suggested posts

La bugia del cowboy

Come le megacorporazioni hanno venduto agli americani una grossa falsità

La bugia del cowboy

È una brillante mattina d'oro sulle dolci colline dell'ovest, mentre i primi raggi di sole illuminano l'erba ghiacciata sulle pianure. Una mandria di placidi bovini Angus, nerissimi e massicci, si staglia contro l'alba mentre percorrono un sentiero battuto verso un luogo che tutti conoscono bene; il bancone della colazione.

Ripensare i media: le cinque verità di McChesney e il futuro delle comunicazioni

Nel mondo iperconnesso di oggi, i sistemi dei media svolgono un ruolo fondamentale nel plasmare l'opinione pubblica e, di conseguenza, nel processo decisionale democratico. Nella sua profonda analisi dell'economia politica della comunicazione, lo studioso Robert McChesney sfida la saggezza convenzionale e presenta quelle che definisce le "cinque verità" sui media.

Related posts

Il primo libro per sballarsi di un bambino

Il primo libro per sballarsi di un bambino

(Attenzione: questa è satira, destinata ad essere allegramente sovversiva, sicuramente non per bambini) Hai visto tua madre e tuo padre nascondersi in cucina e fumare quelle sigarette puzzolenti. Ti dicono.

Creazione di un ambiente di lavoro sicuro

Creazione di un ambiente di lavoro sicuro

“Mi proteggerà quando sarò in pericolo. mi nasconderà nella sua tenda.

L'arte è sempre apolitica?

L'arte è sempre apolitica?

Ieri abbiamo chiuso le porte dell'Eurovision Song Contest di quest'anno con un gran finale scintillante e caotico in cui la cantante svedese Loreen ha portato a casa il trofeo, diventando la prima donna a vincere due volte e riportando la corona alla Svezia 50 anni dopo che gli ABBA hanno vinto la competizione con "Waterloo". Hanno continuato a diventare uno dei più grandi artisti nel canone della musica pop.

L'assassinio di Jordan Neely e il problema del razzismo "patriottico".

Gli Stati Uniti possono fare il passo essenziale per non equiparare il comportamento razzista all'essere un buon americano?

L'assassinio di Jordan Neely e il problema del razzismo "patriottico".

[Avviso di attivazione: questo saggio include schermate di persone che elogiano l'assassino di Jordan Neely.] I funzionari delle forze dell'ordine hanno finalmente - e forse con riluttanza - accusato Daniel Penny, l'uomo che ha soffocato Jordan Neely fino alla sua morte, per quell'omicidio.