주어진 문자열에 특수문자
장식을 붙이는 프로그램을 작성하고자 한다.
예를 들어 주어진 문자열이 “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"로 등록되어있다.