본문 바로가기

java/Design Pattern

Decorator

자바 디자인 패턴 8 - Decorator


1. Decorator 패턴은..


기존에 구현되어 있는 클래스에 기능을 추가하기 위한 패턴입니다. 기존에 있던 클래스를 상속하여 만들기 때문에 기존 클래스와 사용법이 크게 다르지는 않습니다.


2. 예제


-------------- 데코레이터 -------------

package ch08_Decorator;

public class Decorator {

    public String getMerong(){

        return "merong";

    }

}


-------------- 데코레이터를 상속 받은 넘 ----

package ch08_Decorator;

public class ChildDecorator extends Decorator{

    private Decorator decorator;

    public ChildDecorator(Decorator decorator){

        this.decorator = decorator;

    }

    @Override

    public String getMerong(){

        return "@" + decorator.getMerong() + "@";

    }

}


-------------- 테스트 클래스 --------------

package ch08_Decorator;

public class Test {

    public static void main(String[] args) {

        Decorator decorator = new Decorator();

        System.out.println(decorator.getMerong());

        Decorator child = new ChildDecorator(decorator);

        System.out.println(child.getMerong());

        Decorator child2 = new ChildDecorator(child);

        System.out.println(child2.getMerong());

    }

}

-------------- 결과 -----------------

merong

@merong@

@@merong@@


데코레이터 패턴에서 상위클래스(Decorator라 합니다.) 와 하위 클래스(ConcreteDecorator라 합니다.) 와의 관계를 알아봅시다.

첫째, 하위 클래스는 상위클래스의 형식을 멤버변수로 가집니다. ChildDecorator 는 Decorator를 멤버변수로 받습니다. 일반적으로 생성자의 인자로 받아서 멤버변수로 쎄팅을 합니다. 별도의 setter를 가지는 경우는 거의 없습니다.

둘째, 하위 클래스는 상위클래스를 상속 받아 상위클래스의 메쏘드를 이용합니다. 하위 클래스의 getMerong() 이라는 메쏘드는 상위 클래스의 getMerong()을 오버라이드하지만, 내부적으로 상위클래스의 getMerong()을 사용하고 있습니다.


3. Decorator가 일반적인 상속과 다른 점


Decorator는 메쏘드의 확장 개념입니다. 멤버 변수로 받은 객체의 메쏘드를 이용하여 그 메쏘드를 확장하는 것입니다.


4. JAVA API에 있는 Decorator


java.io에 있는 InputStream, Reader, OutputStream, Writer 등은 모두 Decorator 패턴으로 구성되어 있습니다.

파일을 Reader로 읽는 경우를 살펴보겠습니다.


Reader reader = new FileReader("파일명");


Reader reader = new BufferedReader(new FileReader("파일명");


파일은 위의 두가지 방법으로 모두 읽을 수 있습니다. 둘다 Reader의 형식으로 받습니다. BufferedReader의 생성자는 Reader를 받아 멤버 변수로 가지고 있으며, Reader를 상속 받습니다. 멤버 변수로 받은 Reader를 이용하여, 버퍼를 이용해서 읽습니다.

'java > Design Pattern' 카테고리의 다른 글

Facade  (0) 2016.10.12
Chain of Responsibility  (0) 2016.10.12
Composite  (0) 2016.10.12
Strategy  (0) 2016.10.12
Singleton  (0) 2016.10.12