블로그를 변경하였습니다.

해당 블로그는 더 이상 추가 포스팅 없을 예정입니다.

👉 새 블로그 방문하기


전략 패턴 (Strategy Pattern)

2023. 9. 11. 11:42
728x90
반응형

전략 패턴는 정책 패턴(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 메서드를 호출한다.

 

 

728x90
반응형

'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

BELATED ARTICLES

more