디자인 패턴을 구분하는 두 가지 방식 -> Purpose, Scope
그중에 중점으로 살펴볼 방식은 scope에 의한 구분 방식이다.
scope는 두 가지로 나뉠 수 있다 -> 클래스, 오브젝트
- 클래스는 상속(inheritance)을 통한 확장성을 가진 패턴
- 오브젝트는 합성(composition)을 이용한 패턴
대부분의 디자인 패턴은 오브젝트 패턴이다.
가능하면 오브젝트 합성을 상속보다 더 선호하라는 디자인 패턴의 기본 객체지향 원리를 따른 것이다.
오브젝트 합성을 이용하는 디자인 패턴을 적용할 때 스프링의 의존관계 주입을 사용
- 앞에 설명한 전략 패턴 또한 이에 해당
데코레이터(Decorator) 디자인 패턴
오브젝트에 부가적인 기능/책임을 동적으로 부여하는 디자인 패턴
- 기존의 코드는 건드리지 않고, 부가적인 기능을 추가할 수 있게 해주는 기법
- 위의 오브젝트 합성을 이용
의존성 역전 원칙(Dependency Inversion Principle)
- 상위 수준의 모듈은 하위 수준의 모듈에 의존해서는 안 된다. 둘 모두 추상화에 의존해야 한다.
- 추상화는 구체적인 사항에 의존해서는 안된다. 구체적인 사항은 추상화에 의존해야 한다.
지금까지 예제 코드를 통해서 구성한 것과 마찬가지로
DIP는 먼저 인터페이스를 통해서 추상화에 의존하도록 코드를 만들어야 한다.
그리고 인터페이스의 소유권의 역전도 필요하다.
Separate Interface 패턴
보통은 interface의 위치를 구현이 존재하는 패키지에 위치하는데
이를 interface를 사용하는 클라이언트와 같은 패키지에 위치하게 해야 한다.
만약 이를 사용하는 클라이언트가 여럿인 경우에는 별개의 패키지에 interface에 구분