βοΈ Java Design-Pattern β £ - Template Method
βοΈ Java Design-Pattern β
£ - Template Method
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Template Method
ν¨ν΄μ΄λ?
- μμ ν΄λμ€μ λΌλλ‘μ¨ ν νλ¦Ώμ΄ λ μΆμ λ©μλλ₯Ό μ μνκ³ , νμ λ©μλμμ κ·Έκ²μ ꡬ체μ μΌλ‘ ꡬννλ ν¨ν΄μ΄λ€.
- μ΄λ νμ ν΄λμ€μμ ꡬνμ λ¬λ¦¬ νλλΌλ μμ ν΄λμ€μ ν νλ¦Ώμ λ°λΌ μ²λ¦¬μ ν° νλ¦μ μ ν΄μ Έ μλ€.
- μ€μ ν νλ¦Ώμ λΉμ νλ©΄, ν νλ¦Ώ ꡬλ©μ ν΅ν΄ μ΄λ€ ννμ λ¬ΈμμΈμ§ μ μ μμ§λ§ μ΄λ€ λꡬλ₯Ό μ¬μ©νλλμ λ°λΌ μκΉ, λλ ꡬ체μ μΈ λͺ¨μμ΄ λ¬λΌμ§λ€.
μμ νλ‘κ·Έλ¨
- λ¬Έμμ΄κ³Ό λ¬Έμμ΄ λ¦¬μ€νΈλ₯Ό μΆλ ₯νλ κ°λ¨ν νλ‘κ·Έλ¨μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
public abstract class AbstractDisplay {
public abstract void open();
public abstract void print();
public abstract void close();
public final void display() {
open();
print();
close();
}
}
AstractDisplay
ν΄λμ€λdisplay()
λ©μλλ§ κ΅¬νλμ΄ μμΌλ©° λλ¨Έμ§ μΈ κ°μ λ©μλλ μΆμ λ©μλλ‘ μ μλμ΄ μλ€.- μΆμ λ©μλκ° μμμ μ€λͺ ν ν νλ¦Ώμ΄λ€.
- μΈ κ°μ μΆμ λ©μλλ νμ ν΄λμ€λ₯Ό νμΈνμ§ μλ ν μ΄λ€ λμμ νλμ§ μ μ μλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class OneLineDisplay extends AbstractDisplay {
private String str;
public OneLineDisplay(String str) {
this.str = str;
}
@Override
public void open() {
System.out.println("<<");
}
@Override
public void print() {
System.out.println(str);
}
@Override
public void close() {
System.out.println(">>");
}
}
OneLineDisplay
ν΄λμ€λ μΆμ ν΄λμ€λ₯Ό μμ λ°μ ν μ€μ λ©μμ§λ₯Ό μΆλ ₯νλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class MultiLineDisplay extends AbstractDisplay {
private List<String> lines;
public MultiLineDisplay(List<String> lines) {
this.lines = lines;
}
@Override
public void open() {
System.out.println("=====================");
}
@Override
public void print() {
for (String str : lines) {
System.out.println(str);
}
}
@Override
public void close() {
System.out.println("=====================");
}
}
MultiLineDisplay
ν΄λμ€λ μΆμ ν΄λμ€λ₯Ό μμ λ°μ μ¬λ¬ μ€μ λ©μμ§λ₯Ό μΆλ ₯νλ€.
1
2
3
4
5
6
7
8
9
10
11
public class Main {
public static void main(String[] args) {
AbstractDisplay d1 = new OneLineDisplay("μ΄μμ μ½λ©νΈκ° λ¬λ Έμ΅λλ€.");
List<String> strList = new ArrayList<>(Arrays.asList({"μλ
νμΈμ, CO-WORKINGμ
λλ€.", "νμκ°μ
μ΄ μλ£λμμ΅λλ€!", "κ°μ¬ν©λλ€."}));
AbstractDisplay d2 = new MultiLineDisplay(strList);
d1.display();
d2.display();
}
}
- μΆμ ν΄λμ€ λ³μμ ꡬν체 μΈμ€ν΄μ€λ₯Ό μ£Όμ νμ¬ λ©μμ§λ₯Ό μΆλ ₯νλ λ©μΈ ν΄λμ€μ΄λ€.
μ²΄ν¬ ν¬μΈνΈ
β λ‘μ§ κ³΅ν΅ν
- μμ ν΄λμ€μ ν νλ¦Ώ λ©μλμ μκ³ λ¦¬μ¦μ΄ κΈ°μ λμ΄ μμΌλ―λ‘ νμ ν΄λμ€μμλ μκ³ λ¦¬μ¦μ μΌμΌμ΄ κΈ°μ ν νμκ° μλ€.
- κ°λ Ή ν΄λΉ ν¨ν΄μ μ¬μ©νμ§ μκ³ κ΅¬ν ν΄λμ€λ₯Ό μ¬λ¬ κ° λ§λ€μ΄ λ²λ¦°λ€λ©΄ λ²κ·Έλ₯Ό λ°κ²¬ν κ²½μ° λͺ¨λ ν΄λμ€λ₯Ό μμ ν΄μΌ νλ€.
- κ·Έλ¬λ©΄ λ ν μ€νΈν΄μΌ ν λ²μκ° λμ΄μ§λ€.
- νμ§λ§ ν΄λΉ ν¨ν΄μ μ¬μ©νλ©΄, ν νλ¦Ώ λ©μλλ§ μμ νλ©΄ λλ€.
β νμ ν΄λμ€λ₯Ό μμ ν΄λμ€μ λμΌμνλ€.
instanceof
λ±μΌλ‘ νμ ν΄λμ€μ μ’ λ₯λ₯Ό νΉμ νμ§ μμλ νλ‘κ·Έλ¨μ΄ λμνλ€.- μμ ν΄λμ€ν λ³μμ νμ ν΄λμ€μ μ΄λ€ κ²μ λμ
ν΄λ μ λλ‘ λμν μ μκ² νλ μμΉμ
LSP
λΌκ³ νλ€. The Liskov Substitution Principle
μ μ€λ§μ΄λ€.
β μμ ν΄λμ€μμ νμ ν΄λμ€λ‘ μμ²
- ν΄λμ€ κ³μΈ΅μ κ΄ν΄ νμ΅ν λ λ€μκ³Ό κ°μ΄ νμ ν΄λμ€ κ΄μ μμ μκ°ν μ μλ€.
βμμ ν΄λμ€μμ μ μλ λ©μλλ₯Ό νμ ν΄λμ€μμ μ΄μ©ν μ μλ€.β βνμ ν΄λμ€μ μ½κ°μ λ©μλλ₯Ό κΈ°μ νλ κ²λ§μΌλ‘ μλ‘μ΄ κΈ°λ₯μ μΆκ°ν μ μλ€.β βνμ ν΄λμ€μμ λ©μλλ₯Ό μ€λ²λΌμ΄λνλ©΄ λμμ λ³κ²½ν μ μλ€.β
- μμ ν΄λμ€ κ΄μ μμλ λ€μκ³Ό κ°μ΄ μκ°ν μ μλ€.
βνμ ν΄λμ€μμ κ·Έ λ©μλλ₯Ό ꡬννκΈ°λ₯Ό κΈ°λνλ€.β βνμ ν΄λμ€μ ν΄λΉ λ©μλ ꡬνμ μμ²νλ€.β
- νμ ν΄λμ€μλ μμ ν΄λμ€μ μΆμ λ©μλλ₯Ό ꡬνν μ±
μμ΄ μλλ°, μ΄λ₯Ό
Subclass Responsibility
λΌκ³ νλ€.
β μΆμ ν΄λμ€μ μμ
- μΆμ ν΄λμ€λ μΈμ€ν΄μ€λ₯Ό λ§λ€ μ μλ€.
Template Method
ν¨ν΄μ μ΄ν΄νλ©΄ μΆμ ν΄λμ€ λ¨κ³μμ μ²λ¦¬ νλ¦μ νμ±νλ κ²μ΄ μ€μνλ€λ μ μ μ μ μλ€.
β μμ ν΄λμ€μ νμ ν΄λμ€μ νμ‘°
- μμ ν΄λμ€μ μμ€ μ½λκ° μμΌλ©΄ νμ ν΄λμ€ κ΅¬νμ΄ μ΄λ €μΈ μ μλ€.
- μμ ν΄λμ€μμ μ μΈλ μΆμ ν΄λμ€λ₯Ό νμ ν΄λμ€μμ ꡬνν λλ κ·Έ λ©μλκ° μ΄λ€ μμ μ νΈμΆλλμ§ μ΄ν΄ν΄μΌ νλ€.
- μμ ν΄λμ€μ κΈ°μ νλ λ΄μ©μ΄ λ§μμ§λ©΄ νμ ν΄λμ€λ₯Ό μμ±νκΈ° νΈν΄μ§μ§λ§ νμ ν΄λμ€μ μμ λλ λ¨μ΄μ§λ€.
- λ°λ©΄ μμ ν΄λμ€μ κΈ°μ νλ λ΄μ©μ΄ μ μ΄μ§λ©΄ νμ ν΄λμ€λ₯Ό μμ±νκΈ° μ΄λ €μμ§κ³ , κ°κ°μ νμ ν΄λμ€μμ μ²λ¦¬ κΈ°μ μ΄ μ€λ³΅λ μ μλ€.
Template Method
ν¨ν΄μμλ μ²λ¦¬ λ΄μ©μ λΌλλ μμ ν΄λμ€μ κΈ°μ νκ³ , ꡬ체μ μΈ λ΄μ©μ νμ ν΄λμ€μ κΈ°μ νλ€.- κ·Έλ°λ° μ΄λ€ μ²λ¦¬λ₯Ό μμ ν΄λμ€μ λκ³ μ΄λ€ μ²λ¦¬λ₯Ό νμ ν΄λμ€μ λ μ§λ₯Ό κ·μ ν λ§€λ΄μΌμ΄ μλ κ²μ μλκ³ , νλ‘κ·Έλ¨μ μ€κ³νλ μ¬λμ λͺ«μ΄λ€.
This post is licensed under CC BY 4.0 by the author.