[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 지원으로 구현이 용이합니다.
참고 자료
- TypeScript 공식 문서: TypeScript 공식 문서
- Design Patterns: Elements of Reusable Object-Oriented Software, Gang of Four (GoF) Book