Chapter 3. Template Method : 구체적인 처리를 하위 클래스에게 위임

sua·2022년 4월 9일
0
post-thumbnail

1. 예제 프로그램
<AbstractDisplay.java>

package ch03.Sample;

// 추상 클래스 AbstractDisplay
public abstract class AbstractDisplay {
	// 하위 클래스에 구현을 맡기는 추상메소드(1)
	public abstract void open();

	// 하위 클래스에 구현을 맡기는 추상메소드(2)
	public abstract void print();

	// 하위 클래스에 구현을 맡기는 추상메소드(3)
	public abstract void close();

	// 추상 클래스에서 구현하고 있는 메소드 display
	// 전반적인 흐름(메시지 호출 순서)를 결정한다.
	public final void display() {//템플릿 메소드
		// 우선 open하고...
		open();

		// 5번print를 반복하고...
		for (int i = 0; i < 5; i++) {
			print();
		}
		
		// 마지막으로 close한다. 
		close();
	}
}

<CharDisplay.java>

package ch03.Sample;

// CharDisplay는 AbstractDisplay의 하위 클래스
public class CharDisplay extends AbstractDisplay {

	// 표시해야 할 문자를 저장한다.
	private char ch;

	public CharDisplay(char ch) { // 생성자에서 넘어온 문자ch를
		this.ch = ch; // 필드(속성)에 기억해 둔다.
	}

	// 상위 클래스에서는 추상메소드였다. 여기서 오버라이드 해서 구현.
	public void open() {
		System.out.print("<<"); // 시작 문자열로서 "<<"를 표시한다.
	}

	// print메소드로 여기서 구현한다. 이것이 display에서 반복해서 호출된다.
	public void print() {
		System.out.print(ch); // 필드에 기억해둔 문자 1개를 표시
	}

	// close메소드도 여기서 구현
	public void close() {
		System.out.println(">>"); // 종료문자열 ">>"를 표시.
	}
}

<StringDisplay.java>

package ch03.Sample;

// StringDisplay도 AbstractDisplay의 하위 클래스
public class StringDisplay extends AbstractDisplay {
	private String string; // 표시해야 할 문자열을 저장하는 변수

	private int width; // 바이트 단위로 계산한 문자열의 폭

	public StringDisplay(String string) { // 생성자에서 넘어온 문자열 string을
		this.string = string; // 필드에 기억
		
		// 그리고 바이트 단위의 폭도 필드에 기억해 두고 나중에 사용한다.
		this.width = string.getBytes().length;
		//this.width = string.length();
		// System.out.println("string.getBytes().length = " + string.getBytes().length);

		// 아래 문장은 문자열의 갯수를 출력한다.
		// System.out.println("string.length() = " + string.length());
	}

	public void open() { // 오버라이드해서 정의한 open메소드
		printLine(); // 이 클래스의 메소드 printLine에서 선을 그리고 있다.
	}

	public void print() { // print메소드는
		// 필드에 기억해 둔 문자열의 전후에 "|"를 붙여서 표시.
		System.out.println("|" + string + "|");
	}

	public void close() { // close메소드는
		// open과 같이 printLine메소드에서 선을 그리고 있다.
		printLine();
	}

	// open과 close로부터 호출되는 printLine메소드다.
	// private이기 때문에 이 클래스 내에서만 사용된다.
	private void printLine() {
		 // 사각틀의 모퉁이를 표현하는 "+"마크를 표시.
		System.out.print("+");
		
		for (int i = 0; i < width; i++) { // width개의 "-"표시해서
			System.out.print("-"); // 사각틀로서 이용한다.
		}
		
		System.out.println("+"); // 사각틀의 모퉁이를 표현하는 "+"마크를 표시
	}
}

<Main.java>

package ch03.Sample;

public class Main {

	public static void main(String[] args) {
		AbstractDisplay d1; //변수 선언
		d1 = new CharDisplay('a'); //객체 생성
		d1.display();
		
		d1 = new StringDisplay("k");
		d1.display();
		d1 = new StringDisplay("김");
		d1.display();
	}
}
profile
가보자고

0개의 댓글

관련 채용 정보