1.1.10 • Published 5 months ago

@codefrite/design-patterns v1.1.10

Weekly downloads
-
License
ISC
Repository
-
Last release
5 months ago

Design Patterns

Typescript implementation of design patterns:

  • Singleton
  • Channel
  • Subscriber
  • EventHandler

Class Diagram

The diagram below shows the relation between the different classes and interfaces.

Event Handler

@startuml

skin rose

title Event Handler

class Singleton {

  • private static instance: object;
  • protected constructor() {}
  • public static getInstance = () => object; }

interface IChannel<MessageType, ReturnType> <> { + name: string; + subscribers: ISubscriber<MessageType, ReturnType>[]; + subscribe: (sub: ISubscriber<MessageType, ReturnType>) => void; + unsubscribe: (sub: ISubscriber<MessageType, ReturnType>) => void; + notify: (msg: MessageType) => Promise<PromiseSettledResult<Awaited>[]>; }

interface IEventHandler<MessageType, ReturnType> <> {

  • channels: Array<IChannel<MessageType, ReturnType>>;
  • createChannel: (name: string) => void;
  • getChannel: (name: string) => IChannel<MessageType, ReturnType> | undefined;
  • getChannels: () => Array<IChannel<MessageType, ReturnType>>;
  • subscribe: (chName: string, o: ISubscriber<MessageType, ReturnType>) => void;
  • unsubscribe: (chName: string, o: ISubscriber<MessageType, ReturnType>) => void;
  • notify: (chName: string, msg: MessageType) => Promise<PromiseSettledResult<Awaited>[]>; }

interface ISubscriber<MessageType, ReturnType> <> {

  • readonly id: string;
  • update: SubscriberCallback<MessageType, ReturnType>;
  • cb: SubscriberCallback<MessageType, ReturnType>; }

IChannel -- ISubscriber IEventHandler -- Singleton IEventHandler *-- IChannel

@enduml

Usage

Instantiating the Event Handler

To get a reference to the Singleton Event Handler, we can use the static getInstance() class method:

const eventHandler = EventHandler.getInstance<MessageType, ReturnType>();

Indeed, the constructor is declared protected and cannot (in TS at least) and shouldn't be invoked:

export default class EventHandler<MessageType, ReturnType> implements IEventHandler<MessageType, ReturnType> {
  ...

  private static instance: object;

  ...

  /**
   * constructor: Declared protected to defeat instantiation outside of class or child class (Singleton pattern)
   */
  protected constructor() {}

  /**
   * Returns the instance of the EventHandler class (Singleton pattern)
   * @returns the instance of the EventHandler class
   */
  public static getInstance = <MessageType, ReturnType>(): EventHandler<MessageType, ReturnType> =>
    !EventHandler.instance
      ? (EventHandler.instance = new EventHandler<MessageType, ReturnType>())
      : (EventHandler.instance as EventHandler<MessageType, ReturnType>);

  ...
};

Creating Channels

eventHandler.createChannel("keyboard-inputs");
eventHandler.createChannel("mouse-inputs");

Instantiating Subscriber and setting callback

const cb = () => {}
const sub = new Subscriber<MessageType, ReturnType>();
sub.setCallBack(cb)

Subscribing/Unsubscribing to Channel

eventHandler.subscribe("keyboard-inputs", sub);
eventHandler.unsubscribe("keyboard-inputs", sub);

Notifying the Event Handler

eventHandler.notify("keyboard-inputs", message)
1.1.9

5 months ago

1.1.8

5 months ago

1.1.7

5 months ago

1.1.10

5 months ago

1.1.1

10 months ago

1.1.0

11 months ago

1.1.6

6 months ago

1.1.5

7 months ago

1.1.4

7 months ago

1.1.3

10 months ago

1.1.2

10 months ago

1.0.8

11 months ago

1.0.7

11 months ago

1.0.6

11 months ago

1.0.4

11 months ago

1.0.3

11 months ago

1.0.2

11 months ago

1.0.1

11 months ago

1.0.0

11 months ago