본 교재를 기반으로 정리합니다.
데코레이터 패턴은 상속이 아닌 위임을 하는 방식으로 기능을 확장해 나간다.
기능 확장을 위해 FileOutImpl 클래스를 상속받지 않고 Decorator라 불리는 별도의 추상 클래스를 만들었다.
데코레이터를 위한 기반 클래스인 Decorator의 구현
public abstract class Decorator Implements FileOut {
private FileOut delegate; //위임 대상
public Decorator(FileOut delegate){
this.delegate = delegate;
}
protected void doDelegate(byte[] data){
delete.write(data); // delegate에 위임
}
}
BufferedOut 클래스, EncryptionOut 클래스, ZipOut 클래스는 모두 데코레이터 클래스로 Decorator를 상속받고 있다.
EncryptionOut 클래스 구현
public class EncryptionOut extends Decorator {
public EncryptionOut(FileOut delegate) {
super(delegate);
}
public void write(Byte[] data) {
byte[] encryptedData = encrypt(data);
super.doDelegate(encryptedData);
}
private byte[] encrypt(byte[] data) {
...
}
}
EncryptionOut 클래스의 write() 메서드는 파일에 쓸 데이터를 암호화한 뒤에 doDelegate() 메서드를 이용해서 암호화된 데이터를 delegate 객체에 전달한다.
이제 파일의 데이터를 암호화 해서 쓰는 코드를 만들어본다.
FileOut delegate = new FileOutImpl();
FileOut fileOut = new EncryptionOut(delegate);
fileOut.write(data);
데이터를 압축한 뒤 암호화해서 파일에 쓰는 코드를 만들어본다
FileOut delegate = new FileOutImpl();
FileOut fileOut = new EncryptionOut(new ZipOut(delegate));
fileOut.write(data);
이처럼 기존 기능에 새로운 기능을 추가해 준다는 의미로 EncryptionOut 객체를 데코레이터 라고 부른다.
기능 적용 순서의 변경도 쉽다.
아래코드처럼 데코레이터의 생성 순서를 변경해주면 된다.
버퍼 -> 암호화 -> 압축 -> 파일쓰기
FileOut fileOut = new BufferedOut(EncryptionOut(new ZipOut(delegate)));
암호화 -> 압축 -> 버퍼 -> 파일쓰기
FileOut fileOut = new EncryptionOut(new ZipOut(new BufferedOut(delegate)));
FileOutImpl 클래스의 구현을 변경하더라도 EncryptionOut 클래스나 BufferedOut 클래스는 영향을 받지 않으며
EncryptionOut 클래스가 내부 암호화 알고리즘을 변경하더라도 다른 데코레이터나 FileOutImpl 클래스는 영향을 받지 않는다.
즉, 데코레이터 패턴을 단일 책임 원칙을 지킬 수 있도록 만들어준다.
스프링 에서는 트랜잭션 처리를 위해 데코레이터 패턴이 사용된다.
데코레이터 패턴 고려사항
FileOut 타입은 write() 메서드가 한 개만 정의되어 있어 데코레이터의 구현이 간단하지만, 정의되어 있는 메서드가 증가하게 되면 그 만큼 데코레이터의 구현도 복잡해진다.
'나의 주니어 개발 일기 > 헷갈렸던 개념들' 카테고리의 다른 글
세션관리 방법 (0) | 2023.03.11 |
---|---|
[JWT]JWT 동작원리 정리 (0) | 2022.02.21 |
[JAVA 디자인 패턴 정리] 3. 상태(Stat) 패턴 (0) | 2021.12.07 |
[JAVA 디자인 패턴 정리]2. 템플릿 메서드 패턴 (0) | 2021.12.06 |
[JAVA 디자인 패턴 정리]1. 전략 패턴 (0) | 2021.12.06 |