βοΈ Java Design-Pattern β ’ - Adapter
βοΈ Java Design-Pattern β
’ - Adapter
π
γJAVA μΈμ΄λ‘ λ°°μ°λ λμμΈ ν¨ν΄ : μ½κ² λ°°μ°λ GoFμ 23κ°μ§ λμμΈ ν¨ν΄γ
λ₯Ό μ½κ³ μ 리ν κΈμ λλ€.
Adapter
ν¨ν΄μ΄λ?
- μ§λ₯
12
λ³ΌνΈλ‘ λμνλ λ ΈνΈλΆμ κ΅λ₯100
λ³ΌνΈAC
μ μμ μ°κ²°ν λ μ°λ¦¬λAC
μ΄λν°λΌλ μ₯μΉλ₯Ό μ¬μ©νλ€. - μ 곡λ κ²κ³Ό νμν κ² κ·Έ μ¬μ΄μμ
AC
μ΄λν°κ°Adapter
μν μ νλ κ²μ΄λ€. Adapter
ν¨ν΄μ νλ‘κ·Έλλ° μ°¨μμμλ μ΄λ―Έ μ 곡λ μ½λλ₯Ό κ·Έλλ‘ μ¬μ©ν μ μμ λ νμν ννλ‘ λ³ννμ¬ μ΄μ©νλ κ²½μ° μ¬μ©νλ€.- κ·Έλμ
Adapter
ν¨ν΄μWrapper
ν¨ν΄μ΄λΌκ³ νννλ€. Adapter
ν¨ν΄μ λ€μ λ κ°μ§ λ°©λ²μΌλ‘ ꡬνν μ μλ€.- ν΄λμ€ μμμ μ΄μ©νμ¬ μ€κ° μν μ μννλ€.
- μ€κ° μν μ μΈμ€ν΄μ€μ μμνλ€.
μμ νλ‘κ·Έλ¨
- λ€μ νλ‘κ·Έλ¨μ μ 무μ μΈλΆ μ 보λ₯Ό μΆλ ₯νλ λ·°μ΄λ₯Ό ꡬνν κ²μ΄λ€.
- μμμ μΈκΈν ν΄λμ€λ₯Ό μμνλ λ°©λ²κ³Ό μμμ μ¬μ©νλ λ°©λ² λͺ¨λ μ΄ν΄λ³Ό κ²μ΄λ€.
β ν΄λμ€λ₯Ό μμνλ λ°©λ²
1
2
3
4
5
6
7
8
9
10
11
public class TaskViewerΒ Β {
private Task task;
public TaskViewer(Task task) {
this.task = task;
}
public void showTaskInfo() {
System.out.println(task.getName());
}
}
TaskViewer
ν΄λμ€λ μ°λ¦¬μκ² μ£Όμ΄μ§ κ²μ΄λΌκ³ κ°μ νλ€.- ν΄λΉ ν΄λμ€μ μ‘΄μ¬νλ
showTaskInfo()
λ©μλλ μ 무μ μ΄λ¦λ§ μ μ μμΌλ―λ‘ μ¬μ©μ μ μ₯μμλ μ»μ μ μλ μ λ³΄κ° μ νμ μ΄λ€.
1
2
3
public interface UpgradedTaskViewer {
public abstract void showDetailInfo();
}
UpgradedTaskViewer
μΈν°νμ΄μ€λ μ°λ¦¬κ° νμλ‘ νλ κ²μ΄λ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class TaskDetailViewer extends TaskViewer implements upgradedTaskViewer {
public TaskDetailViewer(Task task) {
super(task);
}
@Override
public void showDetailInfo() {
System.out.println("=============== μ
무 ===============");
showTaskInfo();
System.out.println(task.getDescription());
System.out.println("============= νμμ
무 =============");
List<SubTask> subTasks = task.getSubTasks();
for (SubTask subTask : subTasks) {
System.out.println(subTask.getName());
}
}
}
TaskDetailViewer
ν΄λμ€λ μ΄λν° μν μ νλ€.TaskViewer
ν΄λμ€λ₯Ό μμνλ λμμupgradeTaskViewer
μΈν°νμ΄μ€λ₯Ό ꡬννλ€.showDetailInfo()
λ©μλλTaskViewer
μshowTaskInfo()
λ©μλμ μ΄μ λΆμ¬ μ¬μ©μμκ² λμ± νλΆν μ 보λ₯Ό μ 곡νλ€.
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Task task = new Task(); // μ λ³΄κ° μΈμ€ν΄μ€ νλμ μ΄κΈ°νλμ΄ μλ€κ³ κ°μ
UpgradedTaskViewer u = new TaskDetailViewer(task);
u.showDetailInfo();
}
}
- λ©μΈ ν΄λμ€μλ
TaskViewer
ν΄λμ€μTaskDetailViewer
ν΄λμ€μ ꡬνμ μμ ν μ¨κ²¨μ Έ μλ€.Β - κ·Έλ¬λ―λ‘ λ©μΈ ν΄λμ€μ μμ μμ΄
UpgradedTaskViewer
μΈν°νμ΄μ€μ ꡬνμ λ³κ²½ν μ μλ€.
β μμμ μμνλ λ°©λ²
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TaskViewerΒ Β {
private Task task;
public TaskViewer(Task task) {
this.task = task;
}
public void showTaskInfo() {
System.out.println(task.getName());
}
public void getTask() {
return this.task;
}
}
TaskViewer
ν΄λμ€λ μμμ μ¬μ©ν λ°©λ²κ³Ό λμΌνλ€.- ꡬν λ°©λ²μ΄ λ°λλλΌλ μ°λ¦¬κ° νμν 건 λ°λμ§ μκΈ° λλ¬Έμ΄λ€.Β
1
2
3
public abstract class UpgradedTaskViewer {
public abstract void showDetailInfo();
}
UpgradedTaskViewer
ν΄λμ€λ μΈν°νμ΄μ€μμ μΆμ ν΄λμ€λ‘ λ°λμλ€.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public class TaskDetailViewer extends UpgradedTaskViewer {
private TaskViewer taskViewer;
public TaskDetailViewer(Task task) {
this.taskViewer = new TaskViewer(task);
}
@Override
public void showDetailInfo() {
System.out.println("=============== μ
무 ===============");
taskViewer.showTaskInfo();
System.out.println(taskViewer.getTask().getDescription());
System.out.println("============= νμμ
무 =============");
List<SubTask> subTasks = taskViewer.getTask().getSubTasks();
for (SubTask subTask : subTasks) {
System.out.println(subTask.getName());
}
}
}
TaskDetailViewer
ν΄λμ€λ μ΄λν° μν μ νλ€.TaskViewer
ν΄λμ€λ₯Ό νλλ‘ κ°μ§λ©° ν΄λΉ νλμ λͺ¨λ κ±Έ μμνλ€.
1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Task task = new Task(); // μ λ³΄κ° μΈμ€ν΄μ€ νλμ μ΄κΈ°νλμ΄ μλ€κ³ κ°μ
UpgradedTaskViewer u = new TaskDetailViewer(task);
u.showDetailInfo();
}
}
- λ©μΈ ν΄λμ€λ λ λ°©λ²μ΄ λμΌνλ€.
μ²΄ν¬ ν¬μΈνΈ
β μ΄λ€ κ²½μ°μ μ¬μ©ν κΉ?
- νλ‘κ·Έλλ°μ λ λ°±μ§μνμμ μμνλ κ²μ μλλ€.
- μ΄λ―Έ μ‘΄μ¬νλ ν΄λμ€λ₯Ό μ΄μ©νλ κ²½μ°λ ννλ€.
Adapter
Β ν¨ν΄μ κΈ°μ‘΄ ν΄λμ€λ₯Ό κ°μΈ νμν ν΄λμ€λ₯Ό λ§λ€μ΄ λ΄λ ν¨ν΄μ΄λ€.- λ²κ·Έκ° λ°μνλλΌλ κΈ°μ‘΄ ν΄λμ€μλ λ²κ·Έκ° μλ κ²μ μκ³ μμΌλ―λ‘Β
Adapter
Β μν μ ν΄λμ€λ₯Ό μ€μ μ μΌλ‘ μ΄ν΄λ³΄λ©΄ λκΈ° λλ¬Έμ νλ‘κ·Έλ¨ κ²μ¬κ° λ§€μ° νΈν΄μ§λ€.
β λ¨μν κΈ°μ‘΄ ν΄λμ€λ₯Ό μμ νλ©΄ λμ§ μλ?
- λ§μ½ μ΄λ―Έ λ§λ€μ΄μ§ ν΄λμ€κ° μκ³ μλ‘μ΄Β
API
μ λ§μΆλ€κ³ κ°μ νλ©΄ μ°λ¦¬λ€μ κΈ°μ‘΄ ν΄λμ€λ₯Ό λ§μ Έμ μμ νκ³ λ§λ€. - νμ§λ§ κ·Έλ κ² νλ©΄ λμ ν μ€νΈκ° μ΄λ―Έ λλ¬μμλ μμ λμΌλ λ€μ ν μ€νΈν΄μΌ νλ€.
Adapter
Β ν¨ν΄μ λͺ©μ μ κΈ°μ‘΄ ν΄λμ€λ₯Ό μ ν μμ νμ§ μκ³ μλ‘μ΄ΒAPI
λ₯Ό κ°λ°νλ κ²μ΄λ€.- λν κΈ°μ‘΄ ν΄λμ€μ μμ€ μ½λκ° λ°λμ νμν κ²μ μλκ³ κΈ°μ‘΄ ν΄λμ€μ μ¬μλ§ μλ©΄ μλ‘μ΄ ν΄λμ€λ₯Ό λ§λ€ μ μλ€.
β λ²μ μ κ·Έλ μ΄λμ νΈνμ±
- μννΈμ¨μ΄λ λ²μ μ κ·Έλ μ΄λκ° νμνλ€.
- νμ§λ§ μ΄λ ꡬλ²μ κ³Όμ νΈνμ±μ΄ λ¬Έμ κ° λλ€.
Adapter
Β ν¨ν΄μ μ λ²μ κ³Ό ꡬλ²μ μ 곡쑴μν€κ³ μ μ§λ³΄μκΉμ§ νΈνκ² ν μ μλλ‘ λμμ€λ€.
β λ λ¨μ΄μ§ ν΄λμ€
Adapter
Β μν κ³ΌΒTarget
Β μν μ κΈ°λ₯μ΄ λ무 λ λ¨μ΄μ§ κ²½μ°μλΒAdapter
Β ν¨ν΄μ μ¬μ©ν μ μλ€.
β μμκ³Ό μμ, μ΄λ μͺ½μ μ¬μ©ν΄μΌ ν κΉ?
- μΌλ°μ μΌλ‘ μμμ μ¬μ©νλ κ²λ³΄λ€ μμμ μ¬μ©νλ νΈμ΄ λ¬Έμ κ° μ λ€.Β
- κ·Έ μ΄μ λ μμ ν΄λμ€μ λ΄λΆ λμμ μμΈν λͺ¨λ₯΄λ©΄ μμμ ν¨κ³Όμ μΌλ‘ μ¬μ©νκΈ° μ΄λ €μ΄ κ²½μ°κ° λ§κΈ° λλ¬Έμ΄λ€.
νκ³
- μ¬μ€ μμ νλ‘κ·Έλ¨μ΄ μ± μ λ΄μ©κ³Όλ λ€λ₯΄λ€.
- μ± μ μλ μ½λλ₯Ό κ·Έμ νμ΄νν λλ³΄λ€ μ΄ νΈμ΄ λμ± μ΄ν΄κ° μ λλ κ² κ°λ€.
This post is licensed under CC BY 4.0 by the author.