[GoF] Decorator 패턴 : 장식들과 내용물을 동일시한다 [객체에 장식을 더해 가는 패턴]

2023. 9. 5. 20:51·◈ Study/디자인패턴(GoF)🥞
728x90

- Decorator 패턴 : 장식들과 내용물을 동일시한다

Decorator 패턴은 중심이 되는 객체가 있고, 거기에 장식이 되는 기능을 하나씩 추가해서 목적에 더 맞는 객체로 만들어 가는 패턴이다. 객체에 장식을 더해 가는 디자인 패턴이라 이해하면 된다.

Decorator 패턴 / 참고자료 : https://refactoring.guru/ko/design-patterns/decorator

- 어떤 경우에 사용할까?

Decorator 패턴에서는 장식틀과 내용물이 공통의 인터페이스를 가지지만, 감싸면 감쌀수록 기능이 추가된다. 이때 감싸지는 쪽을 수정할 필요는 없기에, 내용물을 변경하지 않고 기능을 추가할 수 있다.

- 예제 코드

Decorator 패턴 클래스 다이어그램 / 참고자료 : JAVA 언어로 배우는 디자인 패턴 입문


이름 설명
Display 문자열 표시용 추상 클래스
StringDisplay 1행으로 구성된 문자열 표시용 클래스
Border '장식틀'을 나타내는 추상 클래스
SideBorder 좌우에만 장식틀을 붙이는 클래스
FullBorder 상하좌우에 장식틀을 붙이는 클래스
Main 동작 테스트용 클래스

- Display 클래스

public abstract class Display {
	public abstract int getColumns();           // 가로 문자 수를 얻는다
	public abstract int getRows();              // 세로 행 수를 얻는다
	public abstract String getRowText(int row); // row행째 문자열을 얻는다
	
	// 모든 행을 표시한다
	public void show() {
		for(int i = 0 ; i < getRows() ; i++) {
			System.out.println(getRowText(i));
		}
	}
}

- StringDisplay 클래스

public class StringDisplay extends Display {
	private String string; // 표시 문자열

	public StringDisplay(String string) {
		this.string = string;
	}

	@Override
	public int getColumns() {
		return string.length();
	}

	@Override
	public int getRows() {
		return 1; // 행수는 1
	}

	@Override
	public String getRowText(int row) {
		if(row != 0) {
			throw new IndexOutOfBoundsException();
		}
		return string;
	}
}

- Border 클래스

public abstract class Border extends Display {
	protected Display display; // 이 장식들이 감싸는 '내용물'
	
	protected Border(Display display) { // 인스턴스 생성 시 '내용물'을 인수로 지정
		this.display = display;
	}
}

- SideBorder 클래스

public class SideBorder extends Border {
	private char borderChar; // 장식 문자

	// 내용물이 될 Display와 장식 문자를 지정
	public SideBorder(Display display, char ch) {
		super(display);
		this.borderChar = ch;
	}

	@Override
	public int getColumns() {
		// 문자 수는 내용물의 양쪽에 장식 문자만큼 더한 것
		return 1 + display.getColumns() + 1;
	}

	@Override
	public int getRows() {
		// 행수는 내용물의 행수와 같다
		return display.getRows();
	}

	@Override
	public String getRowText(int row) {
		// 지정 행의 내용은 내용물의 지정 행 양쪽에 장식 문자를 붙인 것
		return borderChar + display.getRowText(row) + borderChar;
	}
}

FullBorder 클래스

public class FullBorder extends Border {
	public FullBorder(Display display) {
		super(display);
	}

	@Override
	public int getColumns() {
		// 문자 수는 내용물 양쪽에 좌우 장식 문자만큼 더한 것
		return 1 + display.getColumns() + 1;
	}

	@Override
	public int getRows() {
		// 행수는 내용물의 행수에 상하 장식 문자만큼 더한 것
		return 1 + display.getRows() + 1;
	}

	@Override
	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) + "|";
		}
	}

	// 문자 ch로 count 수만큼 연속한 문자열을 만든다
	private String makeLine(char ch, int count) {
		StringBuilder line = new StringBuilder();
		for(int i = 0 ; i < count ; i++) {
			line.append(ch);
		}
		return line.toString();
	}
}

- Main 클래스

public class Main {
	public static void main(String[] args) {
		Display b1 = new StringDisplay("Hello, world.");
		Display b2 = new SideBorder(b1, '#');
		Display b3 = new FullBorder(b2);
		b1.show();
		b2.show();
		b3.show();
		Display b4 =
					new SideBorder(
						new FullBorder(
							new FullBorder(
								new SideBorder(
									new FullBorder(
										new StringDisplay("Hello, world.")	
									),
									'*'
								)
							)
						),
						'/'
					);
		b4.show();
	}
}

 

참고문헌 : 유키 히로시 저/김성훈 역(2022), JAVA 언어로 배우는 디자인 패턴 입문, 영진닷컴

참고자료 : https://refactoring.guru/ko/design-patterns/decorator


728x90
'◈ Study/디자인패턴(GoF)🥞' 카테고리의 다른 글
  • [GoF] Composite 패턴 : 그릇과 내용물을 동일시한다 [재귀적인 구조를 만드는 패턴]
  • [GoF] Strategy 패턴 : 알고리즘을 모두 바꾼다 [같은 문제를 다른 방법으로 해결하기 쉽게 만들어주는 패턴]
  • [GoF] Bridge 패턴 : 기능 계층과 구현 계층을 나눈다 [기능의 클래스 계층과 구현의 클래스 계층을 연결하는 패턴]
  • [GoF] Builder 패턴 : 복잡한 인스턴스를 조립한다 [구조를 가진 인스턴스를 만들어 가는 패턴]
예르미(yermi)
예르미(yermi)
끊임없이 제 자신을 계발하는 개발자입니다👨🏻‍💻
  • 예르미(yermi)
    예르미의 코딩노트
    예르미(yermi)
  • 전체
    오늘
    어제
    • 분류 전체보기 (937)
      • ◎ Java (133)
        • Java☕ (93)
        • JSP📋 (26)
        • Applet🧳 (6)
        • Interview👨🏻‍🏫 (8)
      • ◎ JavaScript (48)
        • JavaScript🦎 (25)
        • jQuery🌊 (8)
        • React🌐 (2)
        • Vue.js🔰 (6)
        • Node.js🫒 (3)
        • Google App Script🐑 (4)
      • ◎ HTML5+CSS3 (17)
        • HTML5📝 (8)
        • CSS3🎨 (9)
      • ──────────── (0)
      • ▣ Framework (67)
        • Spring🍃 (36)
        • Spring Boot🍀 (12)
        • Bootstrap💜 (3)
        • Selenium🌕 (6)
        • MyBatis🐣 (10)
      • ▣ Tools (47)
        • API🎯 (18)
        • Library🎲 (15)
        • JitPack🚀 (3)
        • Jenkins👨🏻 (7)
        • Thymeleaf🌿 (4)
      • ▣ Server (32)
        • Apache Tomcat🐱 (14)
        • Apache HTTP Server🛡️ (1)
        • Nginx🧶 (7)
        • OracleXE💿 (4)
        • VisualSVN📡 (4)
      • ▣ OS : 운영체제 (18)
        • cmd : 명령프롬프트💻 (10)
        • Linux🐧 (8)
      • ▣ SQL : Database (56)
        • Oracle SQL🏮 (26)
        • PL SQL💾 (9)
        • MySQL🐬 (6)
        • MariaDB🦦 (6)
        • H2 Database🔠 (3)
        • SQL 실전문제🐌 (6)
      • ────────── (0)
      • ◈ Human Project (86)
        • Mini : Library Service📚 (15)
        • 화면 설계 [HTML]🐯 (10)
        • 서버 프로그램 구현🦁 (15)
        • Team : 여수어때🛫 (19)
        • Custom : Student🏫 (9)
        • Custom : Board📖 (18)
      • ◈ Yermi Project (40)
        • 조사모아(Josa-moa)📬 (5)
        • Riddle-Game🧩 (6)
        • 맛있을 지도🍚 (2)
        • 어디 가! 박대리!🙋🏻‍♂️ (5)
        • 조크베어🐻‍❄️ (4)
        • Looks Like Thirty🦉 (2)
        • Toy Project💎 (12)
        • 오픈소스 파헤치기🪐 (4)
      • ◈ Refactoring (15)
        • Mini : Library Service📚 (8)
        • 서버 프로그램 구현🦁 (1)
        • Team : 여수어때🛫 (0)
        • 쿼리 튜닝일지🔧 (6)
      • ◈ Coding Test (89)
        • 백준(BOJ)👨🏻‍💻 (70)
        • 프로그래머스😎 (2)
        • 코드트리🌳 (7)
        • 알고리즘(Algorithm)🎡 (10)
      • ◈ Study (102)
        • 기초튼튼 개발지식🥔 (25)
        • HTTP 웹 지식💡 (4)
        • 클린코드(Clean Code)🩺 (1)
        • 디자인패턴(GoF)🥞 (12)
        • 다이어그램(Diagram)📈 (4)
        • 파이썬(Python)🐍 (16)
        • 에러노트(Error Note)🧱 (34)
        • 웹 보안(Web Security)🔐 (6)
      • ◈ 공부모임 (39)
        • 혼공학습단⏰ (18)
        • 코드트리 챌린지👊🏻 (2)
        • 개발도서 100독👟 (8)
        • 나는 리뷰어다🌾 (11)
      • ◈ 자격증 공부 (37)
        • 정보처리기사🔱 (16)
        • 정보처리산업기사🔅 (9)
        • 컴퓨터활용능력 1급📼 (12)
      • ─────────── (0)
      • ◐ 기타 (113)
        • 알아두면 좋은 팁(tip)✨ (46)
        • 개발자의 일상🎈 (44)
        • 개발도서 서평🔍 (10)
        • 개발관련 세미나🎤 (2)
        • 블로그 꾸미기🎀 (9)
        • 사도신경 프로젝트🎚️ (2)
  • 인기 글

  • 최근 댓글

  • 태그

    BOJ
    jsp
    백준 티어
    Error Note
    Oracle
    Java
    javascript
    프로그래밍
    코딩
    꿀팁
    백준
    코딩 테스트
    Project
    html
    CSS
    spring
    Database
    자바스크립트
    일상
    SQL
  • 250x250
  • hELLO· Designed By정상우.v4.10.3
예르미(yermi)
[GoF] Decorator 패턴 : 장식들과 내용물을 동일시한다 [객체에 장식을 더해 가는 패턴]
상단으로

티스토리툴바