데코레이터 패턴
데코레이터 패턴(Decorator Pattern)은 객체 지향 디자인 패턴 중 하나로 객체에 동적으로 기능을 추가하여 확장할 수 있는 구조 패턴이다. 이 패턴은 상속을 통해 클래스를 확장하는 대신, 객체를 감싸는 방식을 사용하여 기능을 추가하거나 변경한다. 따라서 기존 코드를 수정하지 않고도 새로운 기능을 추가하거나 수정할 수 있게 된다.
데코레이터(Decorator)라는 단어의 의미인 장식자, 꾸미는 사람으로 접근하며 데코레이터 패턴의 역할을 쉽게 이해할 수 있을 것이다.
데코레이터 패턴의 장단점
장점
- 유연한 확장 : 새로운 기능을 추가하거나 기존 기능을 수정할 때 동적으로 기능을 추가하거나 변경할 수 있다.
- 코드 재사용 : 기존 코드를 수정하지 않고도 새로운 기능을 추가할 수 있기 때문에 코드 재사용이 용이하다. 기존 구성 요소를 변경하지 않고 여러 조합으로 새로운 객체를 만들 수 있다.
- 단일 책임 원칙(SRP) 준수 : SRP 원칙을 따르며, 각 데코레이터는 특정 기능의 추가 또는 수정에만 집중한다.
- 개방 폐쇄 원칙(OCP) 준수 : 기존 코드를 변경하지 않고도 새로운 데코레이터 클래스를 추가함으로써 기능을 쉽게 확장할 수 있다.
- 의존성 역전 원칙(DIP) 준수 : 컴포넌트와 데코레이터가 모두 동일한 인터페이스나 추상 클래스를 공유하므로 데코레이터가 컴포넌트에 의존하지 않는다.
단점
- 복잡성 증가 : 객체를 여러 층으로 감싸기 때문에 클래스의 수가 많아지고 복잡성이 증가할 수 있다.
- 순서 의존성 : 데코레이터를 적용하는 순서에 따라 최종적으로 생성되는 객체의 동작이나 상태가 달라질 수 있다.
- 불필요한 복사 : 모든 데코레이터는 원본 객체의 인스턴스를 가지고 있기 때문에 여러 레벨의 데코레이터를 사용할 경우 불필요한 객체 복사가 발생할 수 있다.
데코레이터 패턴을 기존 객체의 기능을 동적으로 수차 또는 수정할 때 유용하게 사용할 수 있는 패턴으로 상속을 통한 확장이 적절하지 않을 때 사용한다, 그러나 무분별하게 많이 사용하면 코드를 복잡하게 만들 수 있으므로 신중하게 적용해야 한다.
데코레이터 패턴의 구조
- Component : 기본 기능을 정의하는 인터페이스로 데코레이터와 구체적인 컴포넌트가 이를 구현 한다. 따라서 컴포넌트는 원본 객체와 데코레이터를 묶는 역할을 한다.
- ConcreteComponent : 기본 기능을 실제로 구현하는 구체적인 컴포넌트로 데코레이터 패턴의 시작점이 된다.
- Decorator : 컴포넌트를 감싸는 추상 클래스나 인터페이스로 새로운 기능을 추가하거나 기존 기능을 수정하기 위한 메서드를 선언한다. 데코레이터를 Component를 멤버 변수로 가진다.
- ConcreteDecorator : 새로운 기능이나 기존 기능을 수정하는 역할을 하는 구체적인 클래스다. 데코레이터 인터페이스를 구현한다.
참고할만한 정보
구조(Structural)패턴
- 클래스나 객체를 조합해 더 큰 구조를 만드는 패턴
- 예를 들어서 서로 다른 인터페이스를 지닌 2개의 객체를 묶어 단일 인터페이스를 제공하거나 객체들을 서로 묶어 새로운 기능을 제공하는 패턴이다.
합성 관계
- 생성자에서 필드에 대한 객체를 생성하는 경우
- 전체 객체의 라이프타임과 부분 객체의 라이프 타임은 의존적이다.
- 즉, 전체 객체가 없어지면 부분 객체도 없어진다.
JAVA - 스프링 부트 DB 접근 기술 ORM (0) | 2024.09.30 |
---|---|
JAVA - 전략 패턴 (1) | 2024.09.27 |
JAVA - 프록시패턴 (0) | 2024.09.27 |
JAVA - 어댑터 패턴 (2) | 2024.09.26 |
JAVA - 콜백 메서드 만들어 보기 (1) (1) | 2024.09.26 |