...

[ Design Pattern / JAVA ] 데코레이터 패턴의 구현 (Decorator) 본문

CS/디자인 패턴

[ Design Pattern / JAVA ] 데코레이터 패턴의 구현 (Decorator)

gi2 2022. 1. 3. 18:41

데코레이터 패턴이란 ,

주어진 상황 및 용도에 따라 어떤 객체에 책임을 덧붙이는 패턴으로, 기능 확장이 필요할 때 서브클래싱 대신 쓸 수 있는 유연한 대안이 될 수 있다. [위키 백과]

 

쉽게 정리하면, 기본 객체에 추가적인 기능을 유연하게 첨가하는 패턴이다.

기본 객체를 변경 없이 기본 객체를 꾸며주는 것이다. 

 

[ 데코레이터 패턴의 장점

[1] 위임을 통해 새로운 행동을 유연하게 추가할 수 있다.

[2] 기존 코드의 수정 없이도 손쉽게 기능을 확장할 수 있다. 

 

 

피자를 한 번 생각해보자.

 


 

피자 도우가 있다고 하자. 피자의 도우는 기본 객체가 된다. 

그리고 이 위에 여러 개의 토핑들을 추가할 것이다. 토핑은 기능이라고 생각하자.

피자의 도우 위에 사용자가 추가로 하는 토핑들을 차례로 얹을 것이다. 

페페로니, 새우, 버섯, 양파, 올리브, 피망 등을 차례로 올리고 치즈로 덮어준다. 

기본 객체(도우)를 그대로 두고 그 위에 기능(토핑)들로 꾸며주는 것이다. 

 

데코레이터 패턴은 이때 꾸며주기 위하여 객체를 감싸는 방법을 이용한다. 

기본 객체를 기능들이 감싸 하나로 만드는 것이다.

이런 식으로 피자 도우의 변형 없이 기본 객체의 기능 추가가 가능해진다. 

 


 

[ 데코레이터 패턴의 구현 ]

 

나만의 아바타를 하나 제작하고 여기에 옷(기능)들을 하나씩 입혀보도록 한다. 

 

[ 클래스 다이어그램 ]

 

[ 코드 구현 ]

 

//Person

public interface Person {
    public void DressingUp();
    public String getDescription();
}

//Woman(남자도동일)

public class Woman implements Person {

    @Override
    public void DressingUp() {
        System.out.println("여자 캐릭터 옷 입기 시작 ~~~~~@.@");
    }

    @Override
    public String getDescription() {
        return "여자";
    }
}

//PersonDecorator

abstract class PersonDecorator implements Person{
    protected Person person;

    public PersonDecorator(Person person){
        this.person = person;
    }
}

//Pants (바지, 상의, 양말 모두 동일)

public class Pants extends PersonDecorator {

    public Pants(Person person) {
        super(person);
    }

    @Override
    public void DressingUp() {
        person.DressingUp();
        WearPants();
    }

    private void WearPants(){
        System.out.println("바지 입는 중...");
    }

    @Override
    public String getDescription() {
        return person.getDescription()+" +바지 입음";
    }
}

//Main

public class Main {
    public static void main(String[] args) {
        Person maria = new Pants(new Woman());
        maria = new Shirt(maria);
        maria = new Socks(maria);
        maria.DressingUp();
        System.out.println(maria.getDescription());
    }
}

 

[ 구현 결과 ]

 

끗..............

기능을 추가한다는 내용에 맞춰서 최대한 구현해보려구햇다...

틀린거잇으면알려주새영

 

 

Comments