6_oHji
6_oHji
ν™˜μ˜ν•©λ‹ˆλ‹€☺
GitHub   Gmail
전체 방문자
였늘
μ–΄μ œ
  • λΆ„λ₯˜ 전체보기 (62)
    • πŸ’‘ DEEP DIVE (17)
      • PATTERN (17)
    • πŸ“ 끄적끄적 (4)
    • 🌈 EXPERIENCE (3)
    • πŸ’» PROJECT (3)
    • πŸ“’ STUDY (34)
      • ALGORITHM (1)
      • JAVA (5)
      • FRONT-END (7)
      • BACK-END (10)
      • SPRING (7)
      • NETWORK (3)
      • CLOUD (1)

λΈ”λ‘œκ·Έ 메뉴

  • ν™ˆ
  • νƒœκ·Έ

곡지사항

인기 κΈ€

졜근 λŒ“κΈ€

졜근 κΈ€

ν‹°μŠ€ν† λ¦¬

κ°œμΈμ •λ³΄

  • ν‹°μŠ€ν† λ¦¬ ν™ˆ
  • μŠ€ν† λ¦¬
  • 포럼
  • 둜그인
hELLO Β· Designed By μ •μƒμš°.
6_oHji
6_oHji
Deep Dive Into Design Patterns - ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄
πŸ’‘ DEEP DIVE/PATTERN

Deep Dive Into Design Patterns - ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄

2024. 5. 20. 16:41

πŸ’‘ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ(Template Method) νŒ¨ν„΄μ΄λž€?

λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ˜ 골격을 μ •μ˜ν•˜μ§€λ§Œ, ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ˜ ꡬ쑰λ₯Ό λ³€κ²½ν•˜μ§€ μ•Šκ³  μžμ‹ ν΄λž˜μŠ€λ“€μ΄ μ•Œκ³ λ¦¬μ¦˜μ˜ νŠΉμ • 단계듀을 μ˜€λ²„λΌμ΄λ“œ(μž¬μ •μ˜)ν•  수 μžˆλ„λ‘ ν•˜λŠ” 행동 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€. μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν…œν”Œλ¦Ών™” ν•˜μ—¬ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€λ§ˆλ‹€ μ„ΈλΆ€ λ™μž‘ 사항을 λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν•©λ‹ˆλ‹€.

 

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€ μƒμ†μ΄λΌλŠ” κΈ°μˆ μ„ κ·ΉλŒ€ν™”ν•˜μ—¬,μ•Œκ³ λ¦¬μ¦˜μ˜ λΌˆλŒ€λ₯Ό λ§žμΆ”λŠ” 것에 μ΄ˆμ μ„ λ‘‘λ‹ˆλ‹€. 이미 μˆ˜λ§Žμ€ ν”„λ ˆμž„μ›Œν¬μ—μ„œ λ§Žμ€ 뢀뢄에 ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄ μ½”λ“œκ°€ μš°λ¦¬λ„ λͺ¨λ₯΄κ²Œ μ μš©λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

 

πŸ’‘ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ³Έ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄

  1. Abstract Class : μ•Œκ³ λ¦¬μ¦˜μ˜ λ‹¨κ³„λ“€μ˜ 역할을 ν•˜λŠ” λ©”μ„œλ“œλ“€μ„ μ„ μ–Έν•˜λ©°, μ΄λŸ¬ν•œ λ©”μ„œλ“œλ₯Ό νŠΉμ • μˆœμ„œλ‘œ ν˜ΈμΆœν•˜λŠ” μ‹€μ œ ν…œν”Œλ¦Ώ λ©”μ„œλ“œλ„ μ„ μ–Έν•©λ‹ˆλ‹€. 단계듀은 abstract둜 μ„ μ–Έλ˜κ±°λ‚˜ 일뢀 λ””ν΄νŠΈ κ΅¬ν˜„μ„ κ°–μŠ΅λ‹ˆλ‹€.
  2. Concrete Class : λͺ¨λ“  단계듀을 μ˜€λ²„λΌμ΄λ“œν•  수 μžˆμ§€λ§Œ, ν…œν”Œλ¦Ώ λ©”μ„œλ“œ μžμ²΄λŠ” μ˜€λ²„λΌμ΄λ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  3. Hook Method : λΆ€λͺ¨μ˜ ν…œν”Œλ¦Ώ λ©”μ„œλ“œμ˜ 영ν–₯μ΄λ‚˜ μˆœμ„œλ₯Ό μ œμ–΄ν•˜κ³  싢을 λ•Œ μ‚¬μš©λ˜λŠ” λ©”μ„œλ“œλ‘œ, μœ„ 클래슀 λ‹€μ΄μ–΄κ·Έλž¨μ—μ„œ step2()κ°€ ν•΄λ‹Ήν•©λ‹ˆλ‹€. ν›… λ©”μ†Œλ“œλŠ” 좔상 λ©”μ†Œλ“œκ°€ μ•„λ‹Œ 일반 λ©”μ†Œλ“œλ‘œ κ΅¬ν˜„ν•˜λŠ”λ°, μ΄λŠ” μ„ νƒμ μœΌλ‘œ μ˜€λ²„λΌμ΄λ“œν•˜κΈ° μœ„ν•΄μ„œμž…λ‹ˆλ‹€.

 

πŸ’‘ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄ κ΅¬ν˜„

abstract class AbstractTemplate {

    // ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ : λ©”μ„œλ“œ μ•žμ— final ν‚€μ›Œλ“œλ₯Ό 뢙이면 μžμ‹ ν΄λž˜μŠ€μ—μ„œ μ˜€λ²„λΌμ΄λ”©μ΄ λΆˆκ°€λŠ₯함.
	// μžμ‹ ν΄λž˜μŠ€μ—μ„œ μƒμœ„ ν…œν”Œλ¦Ώμ„ μ˜€λ²„λΌμ΄λ”©ν•΄μ„œ μžκΈ°λ§ˆμŒλŒ€λ‘œ 바꾸도둝 ν•˜λŠ” ν–‰μœ„λ₯Ό μ›μ²œ 봉쇄
    public final void templateMethod() {
        // μƒμ†ν•˜μ—¬ κ΅¬ν˜„λ˜λ©΄ 싀행될 λ©”μ†Œλ“œλ“€
        step1();
        step2();
        
        if(hook()) { // μ•ˆμ˜ λ‘œμ§μ„ μ‹€ν–‰ν•˜κ±°λ‚˜ μ‹€ν–‰ν•˜μ§€ μ•ŠμŒ
            // ...
        }
        
        step3();
    }

    boolean hook() {
        return true;
    }

    // μƒμ†ν•˜μ—¬ μ‚¬μš©ν•  것이기 λ•Œλ¬Έμ— protected μ ‘κ·Όμ œμ–΄μž μ„€μ •
    protected abstract void step1();
    protected abstract void step2();
    protected abstract void step3();
}
class ImplementationA extends AbstractTemplate {

    @Override
    protected void step1() {}

    @Override
    protected void step2() {}

    @Override
    protected void step3() {}
}

class ImplementationB extends AbstractTemplate {

    @Override
    protected void step1() {}

    @Override
    protected void step2() {}

    @Override
    protected void step3() {}

    // hook λ©”μ†Œλ“œλ₯Ό μ˜€λ²„λΌμ΄λ“œ ν•΄μ„œ false둜 ν•˜μ—¬ ν…œν”Œλ¦Ώμ—μ„œ λ§ˆμ§€λ§‰ 둜직이 μ‹€ν–‰λ˜μ§€ μ•Šλ„λ‘ μ„€μ •
    @Override
    protected boolean hook() {
        return false;
    }
}

 

πŸ’‘ 마무리

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ€

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ μ•Œκ³ λ¦¬μ¦˜μ˜ νŠΉμ • λ‹¨κ³„λ§Œ ν™•μž₯ν•˜κ³ , 전체 μ•Œκ³ λ¦¬μ¦˜μ΄λ‚˜ ν•΄λ‹Ή κ΅¬μ‘°λŠ” ν™•μž₯ν•˜μ§€ μ•Šλ„λ‘ ν•  λ•Œ
  2. λ™μΌν•œ κΈ°λŠ₯은 μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•˜λ©΄μ„œ ν™•μž₯, λ³€ν™”κ°€ ν•„μš”ν•œ λΆ€λΆ„λ§Œ ν•˜μœ„ ν΄λž˜μŠ€μ—μ„œ κ΅¬ν˜„ν•  λ•Œ

에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄, ν΄λΌμ΄μ–ΈνŠΈκ°€ λŒ€κ·œλͺ¨ μ•Œκ³ λ¦¬μ¦˜μ˜ νŠΉμ • λΆ€λΆ„λ§Œ μž¬μ •μ˜ν•˜λ„λ‘ ν•˜μ—¬, μ•Œκ³ λ¦¬μ¦˜μ˜ λ‹€λ₯Έ 뢀뢄에 λ°œμƒν•˜λŠ” λ³€κ²½ μ‚¬ν•­μ˜ 영ν–₯을 덜 받도둝 ν•©λ‹ˆλ‹€.(OCP μ€€μˆ˜) λ˜ν•œ, μƒμœ„ μΆ”μƒν΄λž˜μŠ€λ‘œ λ‘œμ§μ„ 곡톡화 ν•˜μ—¬ μ½”λ“œμ˜ 쀑볡을 쀄일 수 있고, 핡심 λ‘œμ§μ„ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ κ΄€λ¦¬ν•˜λ―€λ‘œμ„œ 관리가 μš©μ΄ν•΄μ§‘λ‹ˆλ‹€.

 

 

 

ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄

/ λ””μžμΈ νŒ¨ν„΄λ“€ / 행동 νŒ¨ν„΄ ν…œν”Œλ¦Ώ λ©”μ„œλ“œ νŒ¨ν„΄ λ‹€μŒ μ΄λ¦„μœΌλ‘œλ„ λΆˆλ¦½λ‹ˆλ‹€: Template Method μ˜λ„ ν…œν”Œλ¦Ώ λ©”μ„œλ“œλŠ” λΆ€λͺ¨ ν΄λž˜μŠ€μ—μ„œ μ•Œκ³ λ¦¬μ¦˜μ˜ 골격을 μ •μ˜ν•˜μ§€λ§Œ, ν•΄λ‹Ή μ•Œκ³ λ¦¬μ¦˜μ˜ ꡬ쑰λ₯Ό λ³€κ²½ν•˜

refactoring.guru

 

πŸ’  ν…œν”Œλ¦Ώ λ©”μ†Œλ“œ(Template Method) νŒ¨ν„΄ - μ™„λ²½ λ§ˆμŠ€ν„°ν•˜κΈ°

Template Method Pattern ν…œν”Œλ¦Ώ λ©”μ„œλ“œ(Template Method) νŒ¨ν„΄μ€ μ—¬λŸ¬ ν΄λž˜μŠ€μ—μ„œ κ³΅ν†΅μœΌλ‘œ μ‚¬μš©ν•˜λŠ” λ©”μ„œλ“œλ₯Ό ν…œν”Œλ¦Ών™” ν•˜μ—¬ μƒμœ„ ν΄λž˜μŠ€μ—μ„œ μ •μ˜ν•˜κ³ , ν•˜μœ„ ν΄λž˜μŠ€λ§ˆλ‹€ μ„ΈλΆ€ λ™μž‘ 사항을 λ‹€λ₯΄κ²Œ κ΅¬ν˜„ν•˜

inpa.tistory.com

 

λ°˜μ‘ν˜•
μ €μž‘μžν‘œμ‹œ λΉ„μ˜λ¦¬ λ³€κ²½κΈˆμ§€
    'πŸ’‘ DEEP DIVE/PATTERN' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€
    • Deep Dive Into Design Patterns - μ „λž΅ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - μƒνƒœ νŒ¨ν„΄
    • Deep Dive Into Design Patterns - λΉŒλ” νŒ¨ν„΄
    • Deep Dive Into Design Patterns - ν”ŒλΌμ΄μ›¨μ΄νŠΈ νŒ¨ν„΄
    6_oHji
    6_oHji
    끄적끄적

    ν‹°μŠ€ν† λ¦¬νˆ΄λ°”