전략 패턴 => 알고리즘의 패밀리를 정의해 각각을 클래스에 넣고, 객체간 상호작용을 할 수 있도록 하는 행동 디자인 패턴
/**
* 클라이언트에 필요한 인터페이스를 정의하는 컨텍스트
*/
class Context {
/**
* 컨텍스트에는 하나의 전략 객체만이 저장되며, 자세한 내용을 컨텍스트가 알지는 못함
* 컨텍스트는 모든 전략 객체와 소통할 수 있어야 함
*/
private strategy: Strategy;
/**
* setter로도 구현 가능
*/
constructor(strategy: Strategy) {
this.strategy = strategy;
}
public setStrategy(strategy: Strategy) {
this.strategy = strategy;
}
/**
* 컨텍스트는 전략 객체에 실질적인 작업을 위임함
*/
public doSomeBusinessLogic(): void {
console.log('Context: Sorting data using the strategy (not sure how it\'ll do it)');
const result = this.strategy.doAlgorithm(['a', 'b', 'c', 'd', 'e']);
console.log(result.join(','));
}
}
/**
* 모든 객체에 적용되는 인터페이스 정의
* 컨텍스트는 구상 전략 객체에 있는 알고리즘을 사용하게 됨
*/
interface Strategy {
doAlgorithm(data: string[]): string[];
}
/**
* 실제 전략 패턴 구현을 하는 부분
* 이를 통해 컨텍스트가 런타임에서 컨텍스트를 바꿀 수 있게 됨
*/
class ConcreteStrategyA implements Strategy {
public doAlgorithm(data: string[]): string[] {
return data.sort();
}
}
class ConcreteStrategyB implements Strategy {
public doAlgorithm(data: string[]): string[] {
return data.reverse();
}
}
/**
* 클라이언트 코드
*/
const context = new Context(new ConcreteStrategyA());
console.log('Client: Strategy is set to normal sorting.');
context.doSomeBusinessLogic();
/*
Context: Sorting data using the strategy (not sure how it'll do it)
a,b,c,d,e
*/
console.log('');
console.log('Client: Strategy is set to reverse sorting.');
context.setStrategy(new ConcreteStrategyB());
context.doSomeBusinessLogic();
/*
Context: Sorting data using the strategy (not sure how it'll do it)
e,d,c,b,a
*/