[디자인 패턴] 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을 출력하게 되면 " 꽃" + " 나무 가 있는 흰색 배경" 이 출력된다
결과적으로 " 꽃 나무 가 있는 흰색 배경이" 출력되게 되는 것이다
이처럼 동적으로 유연하게 객체를 확장시키는 패턴이다
'디자인패턴' 카테고리의 다른 글
[디자인 패턴] ChainOfResponsibility 패턴 (0) | 2020.03.19 |
---|---|
[디자인 패턴] Visitor 패턴 (0) | 2020.03.17 |
[디자인 패턴] Composite 패턴 (0) | 2020.03.13 |
[디자인 패턴] Bridge 패턴 (0) | 2020.03.12 |
[디자인 패턴] AbstractFactory 패턴 (0) | 2020.03.11 |