전략 패턴 (Strategy Pattern)
전략 패턴는 정책 패턴(policy pattern)이라고도 하며, 객체의 행위를 바꾸고 싶은 경우 '직접' 수정하지 않고 전략이라고 부르는 '캡슐화한 알고리즘' 을 컨택스트 안에서 바꿔주면서 상호 교체가 가능하게 만드는 패턴
쉽게 말하면 객체들이 할 수 있는 행위 각각에 대해 전략 클래스를 생성하고, 유사한 행위들을 캡슐화 하는 인터페이스
객체의 행위를 동적으로 바꾸고 싶은 경우 직접 행위를 수정하지 않고 전략을 바꿔주기만 함으로써 행위를 유연하게 확장
class Crawler {
dataScrape(site: string) {
if (site === 'naver') {
console.log('naver')
} else if (site === 'google') {
console.log('google')
} else if (site === 'daum') {
console.log('daum')
}
}
}
(() => {
const crawler = new Crawler();
crawler.dataScrape('naver');
})();
위 예시에서 보이는 것 처럼 각 사이트 별로 데이터를 스크랩하기 위해 Crawler 클래스의 dataScrape 메서드를 사용한다.
dataScrape 메서드는 사이트 정보를 site 라는 파라미터로 전달받아 조건문을 타며 해당하는 곳을 찾아간다.
위 예시에서는 사이트가 3 개 뿐이지만 점차 늘어나 youtube, nate 등 스크랩해야하는 사이트가 늘어날 경우 코드가 길어져 가독성이 나빠지고, 코드를 수정하는데도 어려움이 생기게 된다.
또한 새로운 사이트가 추가될 때마다 dataScrape 메서드를 수정해야한다.
이 부분을 전략 패턴을 활용하여 변경할 수 있다.
interface Scraper {
scraping(): void;
}
class NaverScraper implements Scraper {
scraping(): void {
console.log('naver');
}
}
class GoogleScraper implements Scraper {
scraping(): void {
console.log('google');
}
}
class Crawler {
dataScrape(scraper: Scraper) {
return scraper.scraping();
}
}
(() => {
const crawler = new Crawler();
crawler.dataScrape(new NaverScraper());
})();
1. 스크랩을 기능을 담당할 메서드를 interface 를 생성하였다.
2. 각 사이트 별 스크랩의 로직은 Scraper interface 를 구현하는 클래스를 생성하여 scraping 메서드를 오버라이딩 하여 구현한다.
3. 다음으로 Crawler 클래스의 dataScrape 메서드에서 파라미터로 Scraper 인스턴트를 받도록 하여 scraping 메서드를 호출한다.
'CS > 디자인 패턴' 카테고리의 다른 글
선언형과 함수형 프로그래밍 (0) | 2023.09.11 |
---|---|
MVVM 패턴 (0) | 2023.09.11 |
옵저버 패턴 (Observer Pattern) (0) | 2023.09.11 |
팩토리 패턴 (Factory Pattern) (0) | 2023.09.11 |
싱글톤 (Singleton Pattern) (0) | 2023.09.11 |