Post

Decorator 패턴으로 코드 확장성과 유지보수성 높이기

Decorator Pattern 이 뭘까?


Decorator 패턴이란 어떤 A 라는 클래스에 B 의 기능을 추가, 꾸며주고 싶을때 사용하는 패턴이다! 예를 들어 Phone 이라는 interface 가 있다고 해보자! 그리고 Galaxy24 class가 그친구를 implement 한다!

1
2
3
4
5
6
7
8
9
10
public interface Phone {
	public void getDescription();
}

public class Galaxy24 implements Phone {
	@Override
	public void getDescription(){
		System.out.println("Galaxy24");
	}
}

이상황에서 케이스가 씌워진 Galaxy24 class를 만들고 싶다면 현재는 이렇게 만들어야한다!

1
2
3
4
5
6
7
public class Galaxy24WithCase implements Phone {
	@Override
	public void getDescription(){
		System.out.println("Galaxy24");
		System.out.println("with case");
	}
}

근데 이렇게 만들다보면 열쇠고리 달린 galaxy24, 뭐 하얀 galaxy24…. 등등 클래스가 무수히 많아지고 galaxy25가 나오는 순간 전체 클래스가 2배가 되어버린다! 따라서 열쇠고리, 케이스, 하얀색 이런 친구들을 decorate class로 바꿔버린다! 아래처럼 작성을 한다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public abstract class PhoneDecorator implements Phone {
    private Phone phone;

    public PhoneDecorator(Phone phone) {
		this.phone = phone;
    }

    @Override
    public void getDescription() {
        return phone.getDescription();
    }
}

public class CaseDecorator extends PhoneDecorator {
    private Phone phone;

    public CaseDecorator(Phone phone) {
		super(phone);
    }

    @Override
    public void getDescription() {
        phone.getDescription();
		System.out.println("with case");
    }
}

이렇게 하면 Decorate가 생길때마다 decorate만 추가해주면 된다! client에서 사용은 다음과 같이 하면되겠다!

1
2
3
Phone galaxy24 = new Galaxy24();
Phone galaxy24withcase = new CaseDecorator(galaxy24);
galaxy24withcase.getDescription();

어떤 장점이 있을까?


데코레이터와 기본 클래스가 분리되어 훨씬 관리하기가 수월해진다! 그러면서 단일 책임 원칙 이런 clean code원칙들을 잘 지킬수 있게 된다! 또 decorator 의 decorator 이렇게도 가능해지기 때문에 확장성이 상당히 커진다!

하지만 클래스 초기설정들이 길어 질 수 있어보이니까 너무 많은 decorator를 중첩하여 사용하는것은 자제해야할것같다!

This post is licensed under CC BY 4.0 by the author.

© 병욱. Some rights reserved.