연쇄 패턴(체이닝)

체이닝등을 통해 사슬 구조로 요청을 전달하는 디자인 패턴입니다.

실제 적용 예시

  • 공장에서 자동차를 만들때 하나의 섹션에서 처리하는 것 뒤에 책임의 연쇄 작용으로 점점 만들어져 가는것을 예로 들 수 있습니다.

export class Handler {
  private handler: Handler;
  private req: number;

  constructor(req: number) {
      this.req = req;
  }

  public setHandler(handler: Handler): void {
      this.handler = handler;
  }

  public operation(msg: string, req: number): void {
      if (req <= this.req) {
          this.handlerRequest(msg)
      } else if (this.handler !== null && this.handler !== undefined) {
          this.handler.operation(msg, req);
      }
  }

  public handlerRequest(msg: string): void {
      throw new Error("Abstract method!");
  }
}

export class ConcreteHandler1 extends Handler {
  constructor(req: number) {
      super(req);
  }
  public handlerRequest(msg: string) {
      console.log("Message (ConcreteHandler1) :: ", msg);
  }
}

export class ConcreteHandler2 extends Handler {
  constructor(req: number) {
      super(req);
  }
  public handlerRequest(msg: string) {
      console.log("Message :: (ConcreteHandler2) ", msg);
  }
}

export class ConcreteHandler3 extends Handler {
  constructor(req: number) {
      super(req);
  }
  public handlerRequest(msg: string) {
      console.log("Message :: (ConcreteHandler3) ", msg);
  }
}

언제 사용할까 ?

다양한 종류의 요청을 처리하게 될것으로 보이지만 요청의 순서를 미리 알수 없을때 사용하면 좋습니다. (핸들러들 요청을 처리할 수 있는지 체크하는 순회 로직을 통해)

특정 순서로 체이닝된 요청을 처리하기 위해서 사용하세요.

핸들러끼리 같은 객체를참조하여 관리하면 성능향상에 도움이 됩니다.

장점

  • 순서를 제어하며 요청을 처리할수 있다.

단점

  • 핸들러에 맞지 않는 요청에 의해 요청이 처리 되지 않을 수 있다.