[디자인 패턴] Decorator 패턴

이멀젼씨

·

2020. 3. 15. 17:21

- 정의

 

객체의 결합 을 통해 기능을 동적으로 유연하게 확장 할 수 있게 해주는 패턴이다

 

- UML

1. Picture인터페이스를 만들고 이름을 반환하는 getName메소드를 선언한다

2. Picture인터페이스를 구현하는 BlueBackgroundPicture와 WhiteBackgroundPicture클래스를 만들고 getName함수를 오버라이딩하여 배경색상을 출력하도록 한다

3. Object추상클래스를 정의하여 Picture인터페이스를 담아둘 수 있게 하고, getName메소드를 선언하여 이름을 반환할 수 있도록 한다

4. Object추상클래스를 상속하는 Cloud, Tree, Flower클래스를 정의하고 getName메소드를 오버라이딩하여 각각의 물체 이름을 반환하도록 한다. 생성자를 통해 Picture인터페이스를 받아 저장할 수 있도록 한다

 

 

- 코드

 

Picture interface

public interface Picture {
	public String getName();
}

WhiteBackgroundPicture class

public class WhiteBackgroundPicture implements Picture{
	@Override
	public String getName() {
		return " 가 있는 흰색 배경";
	}
}

BlueBackgroundPicture class

public class BlueBackgroundPicture implements Picture{
	@Override
	public String getName() {
		return " 가 있는 파란색 배경";
	}
}

Object abstract class

public abstract class Object implements Picture {
	protected Picture picture;
	
	public Object(Picture picture) {
		this.picture = picture;
	}
	
	@Override
	public abstract String getName();
}

Tree class

public class Tree extends Object {
	public Tree(Picture picture) {
		super(picture);
	}
	
	@Override
	public String getName() {
		return " 나무"+picture.getName();
	}
}

Flower class

public class Flower extends Object {
	public Flower(Picture picture) {
		super(picture);
	}
	
	@Override
	public String getName() {
		return " 꽃"+picture.getName();
	}
}

Cloud class

public class Cloud extends Object {
	public Cloud(Picture picture) {
		super(picture);
	}
	
	@Override
	public String getName() {
		return " 구름"+picture.getName();
	}
}

Main class

public class Main {
	public static void main(String[] args) {
		Picture whiteBP = new WhiteBackgroundPicture();
		System.out.println(whiteBP.getName());
		
		
		Picture treeWhiteBP = new Tree(whiteBP);
		Picture flowerTreeWhiteBP = new Flower(treeWhiteBP);
		Picture cloudFlowerTreeWhiteBP = new Cloud(flowerTreeWhiteBP);
		System.out.println(cloudFlowerTreeWhiteBP.getName());
		
		
		Picture blueBP = new BlueBackgroundPicture();
		Picture flowerCloudTreeBlueBP = new Flower(new Cloud(new Tree(new BlueBackgroundPicture())));
		System.out.println(flowerCloudTreeBlueBP.getName());
	}
}

출력결과

더보기

 가 있는 흰색 배경
 구름 꽃 나무 가 있는 흰색 배경
 꽃 구름 나무 가 있는 파란색 배경

 

- 설명

 

두번째 출력을 살펴보자

 

우선 먼저 만들어진 하얀색 배경에 나무를 추가하였다

 

Object추상클래스를 상속한 Tree는 Picture타입을 생성자를 통해 필드에 저장하게 된다

 

treeWhiteBP객체를 Picture타입의 whiteBP를 갖고 있는 상태이고, getName을 출력하면 " 나무" + whiteBP.getName()이 호출된다

 

꽃을 추가하였다. Flower역시 Object추상클래스를 상속했기 때문에 생성자를 통해 treeWhiteBP객체를 Flower안에 Picture타입으로 저장할 수 있다.

 

이 경우

flowerTreeWhiteBP.picture는 treeWhiteBP이다.

flowerTreeWhiteBP.getName을 호출하면 " 꽃" + treeWhiteBP.getName을 호출하게 된다

treeWhiteBP의 getName은 " 나무"+ whiteBP.getName()을 호출하기 때문에 " 나무 가 있는 흰색 배경"이 반환된다

다시 돌아와서 flowerTreeWhiteBP.getName을 출력하게 되면 " 꽃" + " 나무 가 있는 흰색 배경" 이 출력된다

결과적으로 " 꽃 나무 가 있는 흰색 배경이" 출력되게 되는 것이다

 

이처럼 동적으로 유연하게 객체를 확장시키는 패턴이다