[typescript] 클래스 상속과 인터페이스 구현을 사용하여 어떤 디자인 패턴을 구현할 수 있는가?

TypeScript는 클래스 상속과 인터페이스 구현을 통해 다양한 디자인 패턴을 구현하는 데 유용하다. 아래에서는 몇 가지 디자인 패턴을 예시와 함께 살펴보겠습니다.

1. 팩토리 메서드 패턴 구현

팩토리 메서드 패턴은 인스턴스화할 클래스를 서브 클래스에서 결정하는 패턴입니다. 이를 TypeScript로 구현하려면, 부모 클래스에 추상 메서드를 선언한 뒤 각각의 서브 클래스에서 해당 메서드를 구현합니다.

// 인터페이스
interface Product {
  operation(): string;
}

// 부모 클래스
abstract class Creator {
  abstract factoryMethod(): Product;

  someOperation(): string {
    const product = this.factoryMethod();
    return `Creator: The same creator's code has just worked with ${product.operation()}`;
  }
}

// 구현한 서브 클래스
class ConcreteProduct1 implements Product {
  operation(): string {
    return '{Result of the ConcreteProduct1}';
  }
}

class ConcreteProduct2 implements Product {
  operation(): string {
    return '{Result of the ConcreteProduct2}';
  }
}

class ConcreteCreator1 extends Creator {
  factoryMethod(): Product {
    return new ConcreteProduct1();
  }
}

class ConcreteCreator2 extends Creator {
  factoryMethod(): Product {
    return new ConcreteProduct2();
  }
}

// 사용 예시
const creator1 = new ConcreteCreator1();
console.log(creator1.someOperation());

const creator2 = new ConcreteCreator2();
console.log(creator2.someOperation());

2. 전략 패턴 구현

전략 패턴은 실행 중에 알고리즘을 선택할 수 있도록 하는 패턴입니다. TypeScript에서는 인터페이스를 활용하여 각 전략을 캡슐화할 수 있습니다.

// 전략을 위한 인터페이스
interface Strategy {
  doAlgorithm(data: string[]): string[];
}

// 구체적인 전략 클래스
class ConcreteStrategyA implements Strategy {
  doAlgorithm(data: string[]): string[] {
    return data.sort();
  }
}

class ConcreteStrategyB implements Strategy {
  doAlgorithm(data: string[]): string[] {
    return data.reverse();
  }
}

// 컨텍스트 클래스
class Context {
  private strategy: Strategy;

  constructor(strategy: Strategy) {
    this.strategy = strategy;
  }

  // 전략 실행
  executeStrategy(data: string[]): string[] {
    return this.strategy.doAlgorithm(data);
  }
}

// 사용 예시
const contextA = new Context(new ConcreteStrategyA());
console.log(contextA.executeStrategy(['a', 'c', 'b']));

const contextB = new Context(new ConcreteStrategyB());
console.log(contextB.executeStrategy(['a', 'c', 'b']));

위의 예시에서 보듯이, TypeScript의 클래스 상속과 인터페이스 구현을 통해 다양한 디자인 패턴을 구현할 수 있습니다. 클래스 상속과 인터페이스를 적절히 활용하여 각 패턴의 특징을 충족하는 코드를 작성할 수 있습니다.

이러한 디자인 패턴은 소프트웨어의 유지보수성, 확장성 등을 고려할 때 매우 유용하며, TypeScript의 강력한 타입 시스템과 OOP 지원으로 구현이 용이합니다.

참고 자료