1. 데코레이터 패턴이란?
: 데코레이터 패턴(Decorator Pattenr)은 주어진 상황 및 용도에 따라 어떤 객체에 책임(기능)을 동적으로 추가하는 패턴을 말한다. 데코레이터라는 말 그대로 장식이라고 생각하면 된다. 기본 기능을 가지고 있는 클래스를 하나 만들어 주고 추가할 수 있는 기능들을 추가하기 편하도록 설계하는 방식이다.
Component : 실질적인 인스턴스를 컨트롤하는 역할
ConcreteComponent : Component의 실질적인 인스턴스의 부분으로 책임의 주체의 역할
Decorator : Component와 ConcreteDecorator를 동일시 하도록 해주는 역할
ConcreteDecoreator : 실질적인 장식 인스턴스 및 정의이며 추가된 책임의 주체
2. 데코레이터 패턴의 장단점
장점
1. 기존 코드를 수정하지 않고도 데코레이터 패턴을 통해 행동을 확장시킬 수 있다.
2. 구성과 위임을 통해서 실행중에 새로운 행동을 추가할 수 있다.
단점
1. 의미없는 객체들이 너무 많이 추가될 수 있다.
2. 데코레이터를 너무 많이 사용하면 코드가 필요 이상으로 복잡해질 수 있다.
3. 데코레이터 패턴 예제
직업과 관련된 예를 들어 보겠다. 나무꾼(Tree)과 대장장이(Smith)라는 직업이 있다고 해보자. 참고로 그냥 생각 나는대로 만든 것이기 때문에 아마 영어 단어가 틀릴 것이다. 특히 나무꾼.... Woodcutter였나? 그랬던 것 같은데... 일단 Tree로 했으니 있는 그대로 바라봐 주기 바란다.
[Job.java]
package decoExam;
public interface Job {
void work();
}
[Smith.java]
package decoExam;
public class Smith implements Job{
@Override
public void work() {
System.out.println("Job: Smith");
}
}
[Tree.java]
package decoExam;
public class Tree implements Job{
@Override
public void work() {
System.out.println("Job: Tree");
}
}
이때 시대가 급변하여 IT 시대가 도래하였다. 모든 직업들이 컴퓨터를 기본으로 다룰 줄 알아야 살아갈 수 있게 되었다. 만약에 컴퓨터를 다루는 나무꾼, 컴퓨터를 다루는 대장장이를 선언하고 싶으면 어떻게 해야 할까? 원래 상속의 개념대로 만든다면 나무꾼, 대장장이 클래스 밑에 '컴퓨터 나무꾼', '컴퓨터 대장장이'라는 클래스를 따로 만들어 나무꾼, 대장장이 클래스를 일일이 상속받아야 할 것이다. 하지만 이렇게 시작하면 나중에 한도 끝도 없이 클래스가 나오게 된다.
바로 이때 데코레이터 패턴을 사용하면 좀 더 효율적으로 클래스를 관리할 수 있다.
우선 직업 자체에 대한 데코레이터를 만들어 보겠다.
[JobDecorator.java]
package decoExam;
public class JobDecorator implements Job {
private Job job;
public JobDecorator(Job job) {
this.job = job;
}
@Override
public void work() {
job.work();
}
}
다음으로 기본 기능은 유지하면서 컴퓨터라는 기능을 새롭게 추가하기 위해서, 컴퓨터 데코레이터를 만들도록 하겠다.
[Computer.java]
package decoExam;
public class Computer extends JobDecorator {
public Computer(Job job) {
super(job);
}
public void work() {
super.work();
System.out.println("컴퓨터를 다룬다.");
}
}
마지막으로 위의 모든 걸 실행시키기 위한 Main 파일을 작성하면 된다.
[Application.java]
package decoExam;
public class Application {
public static void main(String[] args) {
Job tree = new Tree();
Job comTree = new Computer(new Tree());
Job comSmith = new Computer(new Smith());
System.out.println("normal Tree");
tree.work();
System.out.println("\nTree with Computer");
comTree.work();
System.out.println("\nSmith with Computer");
comSmith.work();
}
}
[출력값]
'디자인패턴' 카테고리의 다른 글
프록시 패턴(Proxy Pattetn) (0) | 2022.04.29 |
---|