
이번 글에서는 컴포짓 패턴(Composite Pattern)과 데코레이터 패턴(Decorator Pattern)에 대해 알아보고, 각각의 실제 활용 사례, 장단점, 그리고 유의점을 살펴보겠습니다.
// 컴포넌트 인터페이스
interface Graphic {
void draw();
}
// 리프(Leaf) 클래스
class Circle implements Graphic {
@Override
public void draw() {
System.out.println("Drawing a Circle");
}
}
// 컴포짓(Composite) 클래스
class GraphicGroup implements Graphic {
private List<Graphic> graphics = new ArrayList<>();
public void add(Graphic graphic) {
graphics.add(graphic);
}
@Override
public void draw() {
for (Graphic graphic : graphics) {
graphic.draw();
}
}
}
// 사용
Graphic circle1 = new Circle();
Graphic circle2 = new Circle();
GraphicGroup group = new GraphicGroup();
group.add(circle1);
group.add(circle2);
group.draw();
// 컴포넌트 인터페이스
interface Notifier {
void send(String message);
}
// 구체적인 컴포넌트
class BasicNotifier implements Notifier {
@Override
public void send(String message) {
System.out.println("Sending message: " + message);
}
}
// 데코레이터 추상 클래스
abstract class NotifierDecorator implements Notifier {
protected Notifier notifier;
public NotifierDecorator(Notifier notifier) {
this.notifier = notifier;
}
public void send(String message) {
notifier.send(message);
}
}
// 구체적인 데코레이터
class EmailNotifier extends NotifierDecorator {
public EmailNotifier(Notifier notifier) {
super(notifier);
}
@Override
public void send(String message) {
super.send(message);
System.out.println("Sending email notification: " + message);
}
}
class SMSNotifier extends NotifierDecorator {
public SMSNotifier(Notifier notifier) {
super(notifier);
}
@Override
public void send(String message) {
super.send(message);
System.out.println("Sending SMS notification: " + message);
}
}
// 사용
Notifier notifier = new BasicNotifier();
Notifier emailNotifier = new EmailNotifier(notifier);
Notifier smsNotifier = new SMSNotifier(emailNotifier);
smsNotifier.send("Hello, Decorator Pattern!");