Skip to content

Instantly share code, notes, and snippets.

@semlinker
Created November 30, 2022 01:51
Show Gist options
  • Save semlinker/a42720724627d8b1abe8cacb84c7c0a8 to your computer and use it in GitHub Desktop.
Save semlinker/a42720724627d8b1abe8cacb84c7c0a8 to your computer and use it in GitHub Desktop.
Command Pattern
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://github.com/semlinker");
eventHandler.handleAction("msg", "Hello Semlinker!");
eventHandler.handleAction(new SendMessageCommand(), "Hello Kakuqo!");
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment