Java

[Design Pattern] 데코레이터 패턴(Decorator Pattern)

구루싸 2020. 7. 7. 23:40
반응형
SMALL

날씨는 무더운데

마스크를 끼고 다니려니

얼굴에 뭐가 나는거 같기도...

코로나19에 걸리기 전에

답답해서 죽을 것 같다는...

아무튼 답답함을 이기고

학습을 진행해야겠죠~^^

오늘의 학습 주제는

데코레이터 패턴(Decorator Pattern)입니다

데코레이터는 "장식을 하는 것"을 의미하는데

뭔가 느낌이 어떤 본판에

살을 붙이는 패턴일 것 같네요~

언제나 처럼 데코레이터 패턴의

역할들에 대해 정리하고 시작하겠습니다

역할 설명
Component 기능을 추가할 때 핵심이 되는 역할이며 인터페이스만을 결정
Concrete Component Component 역할의 인스턴스를 구현
장식자(Decorator) Component 역할과 동일한 인터페이스를 가지고 Decorator 역할이 장식할 대상이 되는 Component 역할도 가짐
구체적인 장식자(Concrete Decorator) 구체적인 Decorator 역할

역시 무슨 말인지 모르겠을 땐

무작정 구현을 해보는 것이 상책이겠죠?

1. 추상 클래스(Abstract Class) Display.java

package decoratorPattern;

public abstract class Display {
	public abstract int getColumns();
	public abstract int getRows();
	public abstract String getRowText(int row);
	public final void show() {
		for ( int i = 0; i < getRows(); i++ ) {
			System.out.println(getRowText(i));
		}
	}
}

2. 클래스(Class) StringDisplay.java

package decoratorPattern;

public class StringDisplay extends Display {
	private String string;
	public StringDisplay(String string) {
		this.string = string;
	}
	public int getColumns() {
		return string.getBytes().length;
	}
	public int getRows() {
		return 1;
	}
	public String getRowText(int row) {
		if ( row == 0 ) {
			return string;
		} else {
			return null;
		}
	}
}

3. 추상 클래스(Abstract Class) Border.java

package decoratorPattern;

public abstract class Border extends Display {
	protected Display display;
	protected Border(Display display) {
		this.display = display;
	}
}

4. 클래스(Class) SideBorder.java

package decoratorPattern;

public class SideBorder extends Border {
	private char borderChar;
	public SideBorder(Display display, char ch) {
		super(display);
		this.borderChar = ch;
	}
	public int getColumns() {
		return 1 + display.getColumns() + 1;
	}
	public int getRows() {
		return display.getRows();
	}
	public String getRowText(int row) {
		return borderChar + display.getRowText(row) + borderChar;
	}
}

5. 클래스(Class) FullBorder.java

package decoratorPattern;

public class FullBorder extends Border {
	public FullBorder(Display display) {
		super(display);
	}
	public int getColumns() {
		return 1 + display.getColumns() + 1;
	}
	public int getRows() {
		return 1 + display.getRows() + 1;
	}
	public String getRowText(int row) {
		if ( row == 0 ) {
			return "+" + makeLine('-', display.getColumns()) + "+";
		} else if ( row == display.getRows() + 1) {
			return "+" + makeLine('-', display.getColumns()) + "+";
		} else {
			return "|" + display.getRowText(row - 1) + "|";
		}
	}
	private String makeLine(char ch, int count) {
		StringBuffer buf = new StringBuffer();
		for ( int i = 0; i < count; i++ ) {
			buf.append(ch);
		}
		return buf.toString();
	}
}

6. 클래스(Class) Test.java

import decoratorPattern.*;
public class Test {
	public static void main(String[] args) {
		/* decorator Pattern */
		Display display1 = new StringDisplay("Welcome!");
		Display display2 = new SideBorder(display1, '#');
		Display display3 = new FullBorder(display2);
		display1.show();
		display2.show();
		display3.show();
	}
}

이번 패턴을 잘보시면

장식을 나타내는 Border 클래스와

내용물을 나타내는 Display 클래스가

동일한 인터페이스를 가지고 있습니다

추상 클래스 Display에서

정의한 메소드가 그대로 노출되고

이것을 "투과적"인 인터페이스라고 합니다

이 때문에 지난 번에 학습한

Composite 패턴에서 등장한

재귀적인 구조가 나타날 수 있습니다

내용물이 장식이되고 장식이 내용물이되고...

내용물이 또 장식이되는...뭐...그런?

Composite 패턴이 궁금하시다면

아래의 링크 ↓

2020/07/05 - [Java] - [Design Pattern] 복합체 패턴(Composite Pattern)

 

[Design Pattern] 복합체 패턴(Composite Pattern)

어느 덧 7월 2020년도 하반기로 접어들었습니다 남은 반년 화이팅하시고 좋은 성과와 행복이 가득하시길 기원합니다 아무튼 오늘의 학습 주제는 복합체 패턴입니다 컴퓨터 파일 시스템(File System)

yssa.tistory.com

이 패턴이 사용된 경우를 보면

java.io 패키지가 있습니다

Reader reader = new LineNumberReader(new BufferReader(new FileReader("test.txt")));

휴 벌써 12시가 다되어가네요

이것으로 오늘의 학습을 마치겠습니다

그럼 이만-_-

반응형
LIST