정의
- 알고리즘군을 정의하고 캡슐화해서 각각의 알고리즘군을 수정해서 쓸 수 있다
- 전략 패턴을 사용하면 클라이언트로부터 알고리즘을 분리해서 독립적으로 변경할 수 있다
원칙
- 변경될 수 있는 부분은 따로 뽑아서 캡슐화한다
- 나중에 바뀌지 않는 부분에는 영향을 미치지 않고 그 부분만 고치거나 확장할 수 있다
- 구현보다 인터페이스에 맞춰서 개발한다
- 바뀌는 부분은 코드를 수정하지 않아도 구현체만 바꿔주면 해결할 수 있다
- 중복될 수 있는 인터페이스 메소드는 서브클래스에서 구현하지 않는다
- 상속보다 Composition을 활용한다
중복될 수 있는 인터페이스 메소드를 서브클래스에서 구현하는 경우 단점
- 중복될 수 있는 메소드를 일일히 구현하면 코드를 재사용하지 않으므로, 변경될 때마다 전부 찾아서 바꿔줘야 하기 때문에 관리에 큰 문제가 생긴다
상속의 단점
- 상속을 사용하면 기능을 다르게 사용해야 하는 서브클래스에서 메소드를 오버라이드해서 사용해야 한다
- 오버라이드하는 경우 중복될 수 있는 코드를 재사용하기 어렵다
- 요구사항이 바뀔 때마다 서브클래스 메소드를 일일히 살펴보고 상황에 따라 새롭게 오버라이드해야 한다
Composition(구성|조합|합성)
- 클래스가 다른 클래스의 객체를 멤버로 포함하는 것을 의미한다
- 캡슐화된 인터페이스들을 하나로 모아서 사용할 수 있다
- 슈퍼클래스에서는 캡슐화된 인터페이스의 메소드만 호출하고, 서브클래스에서는 캡슐화된 인터페이스 구현체만 연결하면 된다
- 중복될 수 있는 인터페이스 메소드는 미리 구현해놓고 서브클래스에서 연결만 해주면 되므로 일일히 구현할 필요 없이 코드를 재사용할 수 있다
- 요구사항이 바뀔 때마다 캡슐화된 구현체만 변경하면 되므로 코드 관리가 훨씬 편리하다
- 번역이 제각각인데 구성, 조합, 합성, 컴포지션 등으로 지칭한다
정리
추상 클래스의 몇몇 구상 클래스에서 똑같이 구현해야 하는(중복 사용) 메소드
- 따로 뽑아서 캡슐화한다
- 캡슐화된 인터페이스를 추상 클래스에 선언한다
- 각각의 구상 클래스에서 생성자나 Setter 등을 통해 캡슐화된 인터페이스를 캡슐화된 구현체로 초기화한다
추상 클래스의 모든 구상 클래스에서 똑같이 구현해야 하는(중복 사용) 메소드
- 추상 클래스에서 메소드 구현 후 상속한다
추상 클래스의 구상 클래스에서 각각 다르게 구현해야 하는 메소드
- 추상 메소드로 선언 후 구상 클래스에서 구현한다
예제 코드
'Design Pattern' 카테고리의 다른 글
옵저버 패턴(Observer Pattern) (0) | 2022.05.28 |
---|