목차
1. 데코레이터 패턴이란?
2. 데코레이턴 패턴 구조 예시
3. 코드 예시
4. 결과
5. 참조
데코레이터 패턴이란?
Decorator Pattern 에서 Decorator 는 "장식하는 사람" 을 뜻하며,
우리가 크리스마트 트리에 여러가지 물건들을 Decoration 하듯,
기능을 계속해서 추가할 수 있는 패턴을 뜻합니다.
Decorator Pattern 을 사용하면 실행 중에 동적으로 변경 또는 확장을 할 수 있게 됩니다.
데코레이터 패턴 구조 예시
< Decorator Pattern Structure >
이름 | 내용 |
Item | 내용물(Strings) 과 장식(Decorator )을 다루기 위한 클래스 |
Strings Class | 장식할 대상이 되는 클래스 |
Decorator Class | Strings 를 장식하는 클래스 |
SideDecorator, LineNumberDecorator | 구체적인 장식을 구현한 클래스 |
코드 예시 - 문자열을 다양한 형태로 출력하는 기능
Item 클래스
public abstract class Item {
public abstract int getLinesCount();
public abstract int getMaxLength();
public abstract int getLength(int index);
public abstract String getString(int index);
public void print() {
int cntLines = getLinesCount();
for(int i=0;i<cntLines;i++) {
String string = getString(i);
System.out.println(string);
}
}
}
Strings 클래스
public class Strings extends Item{
private ArrayList<String> strings = new ArrayList<>();
public void add(String item) {
strings.add(item);
}
@Override
public int getLinesCount() {
return strings.size();
}
@Override
public int getMaxLength() {
Iterator<String> iter = strings.iterator();
int maxWidth = 0;
while(iter.hasNext()) {
String string = iter.next();
int width = string.length();
if(width > maxWidth) maxWidth = width;
}
return maxWidth;
}
@Override
public int getLength(int index) {
String string = strings.get(index);
return string.length();
}
@Override
public String getString(int index) {
String string = strings.get(index);
return string;
}
}
Decorator 클래스
public abstract class Decorator extends Item{
protected Item item;
public Decorator(Item item) {
this.item = item;
}
}
SideDecorator 클래스
public class SideDecorator extends Decorator{
private Character ch;
public SideDecorator(Item item, Character ch) {
super(item);
this.ch = ch;
}
@Override
public int getLinesCount() {
return item.getLinesCount();
}
@Override
public int getMaxLength() {
return item.getMaxLength() + 2;
}
@Override
public int getLength(int index) {
return item.getLength(index) + 2;
}
@Override
public String getString(int index) {
return ch + item.getString(index) + ch;
}
}
LineNumberDecorator 클래스
public class LineNumberDecorator extends Decorator{
public LineNumberDecorator(Item item){
super(item);
}
@Override
public int getLinesCount() {
return item.getLinesCount();
}
@Override
public int getMaxLength() {
return item.getMaxLength() + 4;
}
@Override
public int getLength(int index) {
return item.getLength(index) + 4;
}
@Override
public String getString(int index) {
return String.format("%02d", index) + " : " + item.getString(index);
}
}
결과
Main 클래스
기본 Strings 클래스로 출력
public class Main {
public static void main(String[] args) {
Strings strings = new Strings();
strings.add("디자인 패턴");
strings.add("Decorator Pattern");
strings.add("데코레이터 패턴");
strings.add("감사합니다.");
strings.print();
}
}
실행 결과
디자인 패턴
Decorator Pattern
데코레이터 패턴
감사합니다.
Decorator Pattern 사용
public class MainEntry {
public static void main(String[] args) {
Strings strings = new Strings();
strings.add("디자인 패턴");
strings.add("Decorator Pattern");
strings.add("데코레이터 패턴");
strings.add("감사합니다.");
// strings.print();
LineNumberDecorator lineNumberDecorator = new LineNumberDecorator(strings);
lineNumberDecorator.print();
System.out.println();
SideDecorator sideDecorator = new SideDecorator(strings, '*');
sideDecorator.print();
}
}
실행 결과
00 : 디자인 패턴
01 : Decorator Pattern
02 : 데코레이터 패턴
03 : 감사합니다.
*디자인 패턴*
*Decorator Pattern*
*데코레이터 패턴*
*감사합니다.*
참조
https://www.youtube.com/watch?v=UTmY_oB4V8I&list=PLe6NQuuFBu7FhPfxkjDd2cWnTy2y_w_jZ&index=15
'Design Pattern > 구조(Structural) 패턴' 카테고리의 다른 글
11. 방문자 패턴 Visitor Pattern (1) | 2023.11.12 |
---|---|
8. 프록시 패턴 / Proxy Pattern (1) | 2023.11.03 |
6. 브리지 패턴 (Bridge Pattern) (2) | 2023.11.01 |
4. 컴포지트 패턴 (Composite Pattern) (0) | 2023.10.30 |
3. 어댑터 패턴 (Adapter Pattern) (0) | 2023.10.29 |