728x90
β» Java μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ μ λ¬Έ(μμ§λ·μ»΄) λμλ₯Ό λ°νμΌλ‘ μμ±λ λ΄μ©μ λλ€.
Template Method(ν νλ¦Ώ λ©μλ) ν¨ν΄ μκ°
- μμ ν΄λμ€μμ ν νλ¦Ώμ ν΄λΉνλ μΆμ λ©μλ μ μ, νμ ν΄λμ€μμ ν΄λΉ μΆμ λ©μλλ₯Ό μ€μ λ‘ κ΅¬ν
- μμ ν΄λμ€μμ λμ λ° λΌλλ₯Ό κ²°μ νκ³ , νμ ν΄λμ€μμ κ·Έ ꡬ체μ μΈ λ΄μ© κ²°μ νλλ‘ μ€κ³ν ν¨ν΄
- κ°μ λμμ νκ±°λ κ°μ ꡬ쑰λ₯Ό κ°μ‘μ§λ§ μΌλΆ μ½λ(λ΄μ©)λ§ λ€λ₯Έ λ κ° μ΄μμ ν΄λμ€κ° μ‘΄μ¬ν λ μ μ© κ°λ₯
μμ νλ‘κ·Έλ¨ - JAVA
- AbstractDisplay ν΄λμ€ (AbstractDisplay.java)
- AbstractClass(μΆμ ν΄λμ€) μν
public abstract class AbstractDisplay { // μΆμ ν΄λμ€ AbstractDisplay
public abstract void open(); // νμ ν΄λμ€μ ꡬνμ 맑기λ μΆμ λ©μλ (1) open
public abstract void print(); // νμ ν΄λμ€μ ꡬνμ 맑기λ μΆμ λ©μλ (2) print
public abstract void close(); // νμ ν΄λμ€μ ꡬνμ 맑기λ μΆμ λ©μλ (3) close
public final void display() { // μΆμ ν΄λμ€μμ ꡬνλκ³ μλ λ©μλ display
open(); // μ°μ openνκ³ …
for (int i = 0; i < 5; i++) { // 5λ² printμ λ°λ³΅νκ³ …
print();
}
close(); // … λ§μ§λ§μΌλ‘ closeνλ€. μ΄κ²μ΄ display λ©μλμμ ꡬνλκ³ μλ λ΄μ©.
}
}
- CharDisplay ν΄λμ€ (CharDisplay.java)
- ConcreteClass(ꡬν ν΄λμ€) μν
public class CharDisplay extends AbstractDisplay { // CharDisplayλ AbstractDisplayμ νμ ν΄λμ€.
private char ch; // νμν΄μΌ ν λ¬Έμ
public CharDisplay(char ch) { // μμ±μμμ μ λ¬λ λ¬Έμ chμ
this.ch = ch; // νλμ κΈ°μ΅ν΄ λλ€.
}
public void open() { // μμ ν΄λμ€μμλ μΆμ λ©μλμλ€.
// μ¬κΈ°μμ μ€λ²λΌμ΄λν΄μ ꡬν.
System.out.print(“<<”); // κ°μ λ¬Έμμ΄“<<”μ νμνλ€.
}
public void print() { // print λ©μλλ μ¬κΈ°μμ ꡬννλ€.
// μ΄κ²μ΄ displayμμ λ°λ³΅ν΄μ νΈμΆλλ€.
System.out.print(ch); // νλμ κΈ°μ΅ν΄ λ λ¬Έμλ₯Ό 1κ° νμνλ€.
}
public void close() { // close λ©μλλ μ¬κΈ°μμ ꡬν.
System.out.println(“>>”); // μ’
λ£ λ¬Έμμ΄ “>>”μ νμ.
}
}
- StringDisplay ν΄λμ€ (StringDisplay.java)
- ConcreteClass(ꡬν ν΄λμ€) μν
public class StringDisplay extends AbstractDisplay { // StringDisplayλ
// AbstrctDisplayμ νμ ν΄λμ€.
private String string; // νμν΄μΌ ν λ¬Έμμ΄.
private int width; // λ°μ΄νΈ λ¨μλ‘ κ³μ°ν λ¬Έμμ΄μ γνγ.
public StringDisplay(String string) { // μμ±μμμ μ λ¬λ λ¬Έμμ΄ stringμ
this.string = string; // νλμ κΈ°μ΅.
this.width = string.getBytes().length; // κ·Έλ¦¬κ³ λ°μ΄νΈ λ¨μμ νλ νλμ
// κΈ°μ΅ν΄ λκ³ λμ€μ μ¬μ©νλ€.
}
public void open() { // μ€λ²λΌμ΄λν΄μ μ μν open λ©μλ.
printLine(); // μ΄ ν΄λμ€μ λ©μλ printLineμμ
// μ μ κ·Έλ¦¬κ³ μλ€.
}
public void print() { // print λ©μλλ
System.out.println(“|” + string + “|”); // νλμ κΈ°μ΅ν΄ λ λ¬Έμμ΄μ
// μ νμ “|”μ λΆμ¬μ νμ.
}
public void close() { // close λ©μλλ
printLine(); // open μ²λΌ printLine λ©μλμμ
// μ μ κ·Έλ¦¬κ³ μλ€.
}
private void printLine() { // openκ³Ό closeμμ νΈμΆλ printLine λ©μλμ΄λ€.
// privateμ΄κΈ° λλ¬Έμ μ΄ ν΄λμ€ μμμλ§ μ¬μ©λλ€.
System.out.print(γ+γ); // ν
λ리μ λͺ¨μ리λ₯Ό νννλ”+” λ§ν¬λ₯Ό νμ.
for (int i = 0; i < width; i++) { // widthκ°μ “-“μ νμνκ³
System.out.print(γ-γ); // ν
λ리 μ μΌλ‘ μ΄μ©νλ€.
}
System.out.println(γ+γ); // ν
λ리μ λͺ¨μ리λ₯Ό νννλ “+” λ§ν¬λ₯Ό νμ.
}
}
- Main ν΄λμ€ (Main.java)
public class Main {
public static void main(String[] args) {
// 'H'μ κ°μ§ CharDisplay μΈμ€ν΄μ€λ₯Ό 1κ° λ§λ λ€>
AbstractDisplay d1 = new CharDisplay('H');
// “Hello, world.”μ κ°μ§ StringDisplayμ μΈμ€ν΄μ€λ₯Ό 1κ° λ§λ λ€.
AbstractDisplay d2 = new StringDisplay(“Hello, world.”);
// “μλ
νμΈμ.”λ₯Ό κ°μ§ StringDisplayμ μΈμ€ν΄μ€λ₯Ό 1κ° λ§λ λ€.
AbstractDisplay d3 = new StringDisplay(“μλ
νμΈμ.”);
d1.display(); // d1, d2, d3 λͺ¨λ AbstractDisplayμ νμν΄λμ€μ μΈμ€ν΄μ€μ΄κΈ° λλ¬Έμ
d2.display(); // μμν displayλ©μλλ₯Ό νΈμΆν μ μλ€.
d3.display(); // μ€μ λμμ CharDisplayλ StringDisplayμμ κ²°μ νλ€.
}
}
μ₯μ κ³Ό λ¨μ
μ₯μ
- μμ ν΄λμ€μ ν νλ¦Ώ λ©μλμ μκ³ λ¦¬μ¦μ΄ κΈ°μ λμ΄ μμΌλ―λ‘, νμ ν΄λμ€μμ κ°μ μκ³ λ¦¬μ¦μ μΌμΌμ΄ κΈ°μ X
- ν νλ¦Ώ μ½λλ₯Ό μ¬μ¬μ©νμ¬ μ€λ³΅ μ½λ κ°μ
λ¨μ
- 리μ€μ½ν μΉν μμΉ(LSP)λ₯Ό μλ°ν μν μ‘΄μ¬
- μκ³ λ¦¬μ¦ κ΅¬μ‘°κ° λ³΅μ‘ν μλ‘ ν
νλ¦Ώμ μ μ§νκΈ° μ΄λ €μ
- μ¬λ¬ μ νΈμ΄ λ€μ΄κ° 볡μ‘ν μκ³ λ¦¬μ¦μ ν νλ¦Ώ μ½λλ‘ μ μ X
Deep Dive
리μ€μ½ν μΉν μμΉ(LSP)
- "μμ ν΄λμ€νμ λ³μμ νμ ν΄λμ€μ μ΄λ ν μΈμ€ν΄μ€λ₯Ό λμ ν΄λ μ λλ‘ μλν μ μλλ‘ νλ€."
- 리μ€μ½ν μΉν μμΉ μλ°°λ₯Ό μλ°©νκΈ° μν΄ μμ μμλ ν νλ¦Ώ λ©μλ(display)μ finalμ λΆν μμμ΄ λΆκ°λ₯νλλ‘ ν¨ -> μμ ν΄λμ€μ μλλ₯Ό λ³κ²½μν¬ μ μμ
728x90