본문 바로가기

study/이거저거

데코레이터 패턴(Decorator Pattern)

자바 입출력 스트림을 공부하면 데코레이터 패턴이 등장하는데, 이해가 어려워서 따로 정리했다.

 

데코레이터 패턴은 기반 객체(ConcreteComponent)와 그 외 다양한 기능을 제공하는 데코레이터(Decorator)를 사용하여 기반 객체가 다양한 기능을 구현할 수 있게 한다.

 

상속보다 유연한 확장성을 갖고, 지속적인 서비스의 증가와 제거가 편리하다.

 

출처: 위키피디아

 

예) 데코레이터 패턴을 사용한 빼빼로

빼빼로 데코레이터

"빼빼로"라는 추상 클래스가 있다. "빼빼로" 추상 클래스를 상속 받아 기반 객체인 "롯데 빼빼로"를 생성한다.

public abstract class Stick {
	public abstract void eating();
}
public class lotteStick extends Stick{
	@Override
	public void eating() {
		System.out.print("롯데 빼빼로를 먹는다.");
	}
}

 

데코레이터 역할을 하는 "빼빼로"를 상속 받는 추상 클래스 "토핑" 추상 클래스를 만든다. "토핑"은 "빼빼로"의 기능을 구현하고 있지만 new 될 수 없도록 추상 클래스를 만든다.

public abstract class Decorator extends Stick{
	Stick stick;
	public Decorator(Stick stick) {
		this.stick = stick;
	}
	
	@Override
	public void eating() {
		stick.eating();
	}
}

 

"토핑"을 구현하는 클래스 "바나나맛"과 "딸기맛"을 만든다. 이 클래스들은 생성자에서 구현된 "빼빼로"를 전달 받아 기능을 추가한다.

public class Banana extends Decorator{
	public Banana(Stick stick) {
		super(stick);
	}
	@Override
	public void eating() {
		super.eating();
		System.out.print(" 바나나맛이 추가된");
		
	}
}

 

테스트 코드와 출력 결과

public class StickTest {
	public static void main(String[] args) {
		Stick stick = new lotteStick();
		stick.eating();
		System.out.println();
		
		Stick bananaStick = new Banana(stick);
		bananaStick.eating();
	}
}
// 출력결과
롯데 빼빼로를 먹는다.
롯데 빼빼로를 먹는다. 바나나맛이 추가된

 

'study > 이거저거' 카테고리의 다른 글

OAuth 2.0 - 생활코딩 강의 정리(2)  (0) 2021.05.01
OAuth 2.0 - 생활코딩 강의 정리(1)  (0) 2021.05.01
엉터리 정리 - yaml  (0) 2021.03.23
엉터리 정리 - 쿼리 스트링  (0) 2021.03.20
엉터리 정리 - 깃, http, MIME  (0) 2021.03.18