[디자인패턴 수업 8주차 2차시] - Decorator Pattern(test), TextLine

Jin Hur·2021년 10월 21일
0
post-custom-banner

주어진 문자열에 특수문자
장식을 붙이는 프로그램을 작성하고자 한다.
예를 들어 주어진 문자열이 “Young”이라고 할 때 장식을 붙이면 “young*”이 되고 =장식을 붙이면 “=young=”이 된다. 이러한 특수문자 장식은 중첩되어 적용이 가능하다.

Step 1:
문자열을 출력하는 print()라는 메소드를 가지는 AbstractTextLine 인터페이스를 정의하라

public interface AbstractTextLine {
    public void print();
}

Step 2:
AbstractTextLine을 상속받아 실제 문자열을 다룰 TextLine이라는 객체를 만들어라. 이 객체에서는 저장될 문자열을 설정할 수 있는 setter 메소드를 가져야 한다.

public class TextLine implements AbstractTextLine{
    private String textLine;

    public void setTextLine(String textLine) {
        this.textLine = textLine;
    }

    @Override
    public void print() {
        System.out.print(textLine);
    }
}

Step 3:
AbstractTextLine을 상속받아 Decorator의 원형이 될 DecoTextLine을 만들어라. DecoTextLine은 AbstractTextLine 객체를
참조해야 하며 print() 메소드에서 참조된 객체의 print() 메소드를 호출하여야 한다.

public class DecoTextLine implements AbstractTextLine{

    // AbstractTextLine 객체를 참조.
    protected AbstractTextLine decoratedTextLine;

    //public DecoTextLine(AbstractTextLine decoratedTextLine){
    //    this.decoratedTextLine = decoratedTextLine;
    //}

    @Override
    public void print() {
        decoratedTextLine.print();
    }
}

Step 4:
DecoTextLine을 상속받아 *를 붙이는 A_Deco,
=를 붙이는 E_Deco, <>를 앞뒤로 붙이는 G_Deco를 만들어라

// A_Deco
public class A_Deco extends DecoTextLine{
    public A_Deco(AbstractTextLine decoratedTextLine) {
        this.decoratedTextLine = decoratedTextLine;
    }

    @Override
    public void print() {
        System.out.print("*");
        super.print();
        System.out.print("*");
    }
}
// E_Deco
public class E_Deco extends DecoTextLine{

    public E_Deco(AbstractTextLine decoratedTextLine) {
        this.decoratedTextLine = decoratedTextLine;
    }

    @Override
    public void print() {
        System.out.print("=");
        super.print();
        System.out.print("=");
    }
}
// G_Deco
public class G_Deco extends DecoTextLine{

    public G_Deco(AbstractTextLine decoratedTextLine) {
        this.decoratedTextLine = decoratedTextLine;
    }

    @Override
    public void print() {
        System.out.print("<");
        super.print();
        System.out.print(">");
    }
}

메인

public class Main {
    public static void main(String[] args) {
        TextLine text = new TextLine();
        text.setTextLine("Hello World!");

        //AbstractTextLine   // 인스턴스는 여전히 TextLine형이므로 private String textLine; 이 메모리에 있다.
        AbstractTextLine abstractTextLine = new G_Deco(new G_Deco(new E_Deco(new A_Deco(text))));

        abstractTextLine.print();

    }
}

출력 결과

작동 원리

AbstractTextLine abstractTextLine = new G_Deco(new G_Deco(new E_Deco(new A_Deco(text))));

abstractTextLine.print();


참고

// 부모 클래스
public class Parent {
    protected String str = "i'm parent";

    public void print(){
        System.out.println(str);
    }
}
// 자식 클래스
public class Child extends Parent{
    public Child(String str){
        this.str = str;
    }

    @Override
    public void print() {
        System.out.println("aaaaa");
        super.print();
        System.out.println("bbbbb");
    }
}
// Main
public class Main {
    public static void main(String[] args) {
        Parent aaa = new Child("i'm a child");
        aaa.print();
    }
}

=> 부모의 메서드(super.print())를 호출한다 하더래도 멤버변수는 "i'm a child"로 등록되어있다.

post-custom-banner

0개의 댓글