베오
DCode
베오
전체 방문자
오늘
어제
  • 분류 전체보기 (218)
    • 공지사항 (1)
    • 잡설 (1)
    • Programming (33)
      • [C] (1)
      • [Java] (4)
      • [Python] (2)
      • [Android] (2)
      • [Network] (0)
      • [Operation System] (2)
      • [Spring Boot] (22)
      • [Docker] (0)
    • Algorithm (31)
      • 자료구조 (2)
      • 알고리즘 (Java) (14)
      • 알고리즘 (기초) (15)
    • Coding Test (131)
      • BOJ (131)
      • Algospat (0)
    • 이론적인거 (14)
      • 보안 (5)
      • 오류 해결 (2)
      • 디자인 패턴 (5)
      • 네트워크 (1)
      • 기타 (1)
    • 최신기술 (4)
      • 블록체인 (1)
    • [Project] (1)

블로그 메뉴

  • 🐈‍⬛ GitHub
  • 📫 방명록
  • 🔖 태그

공지사항

인기 글

티스토리

hELLO · Designed By 정상우.
베오

DCode

이론적인거/디자인 패턴

[디자인 패턴] Template Method 패턴

2022. 12. 13. 20:29

Template Method 패턴

개요

특정 기능을 수행하기 위한 처리 단계에 대한 기본 구조가 유사할 때 사용한다.

커피와 차를 만드는 방법을 보자

커피 요리법 차 요리법
1. 물을 끓인다. 1. 물을 끓인다.
2. 끓는 물에 커피를 우린다. 2. 끓는 물에 티백을 적신다.
3. 컵에 따른다. 3. 컵에 따른다.
4. 설탕과 우유를 첨가한다. 4. 레몬을 첨가한다.

커피 요리법과 차 요리법은 매우 유사하다. 이를 이용하여 공통적인 부분을 묶는다면 유지보수성이 올라갈 수 있다.


코드

일단 따로따로 구성된 코드를 확인해보자.

class Coffee {
    void prepareRecipe() {
        boilWater();
        brewCoffee();
        pourInCup();
        addSugarAndMilk();
    }

      private void addSugarAndMilk(){
    }

    private void pourInCup() {
    }

    private void brewCoffee() {
    }

    private void boilWater() {
    }
}
class Tea {
    void prepareRecipe() {
        boilWater();
        steepTeaBag();
        pourInCup();
        addLemon();
    }

    private void addLemon() {
    }

    private void steepTeaBag() {
    }

    private void pourInCup() {
    }

    private void boilWater() {
    }
}

요리사 클래스는 각 커피 객체와, 차 객체를 하나씩 생성하고, 레시피 준비를 한다.

class Barista {
        public void cook() {
            Coffee coffee = new Coffee();
            Tea tea = new Tea();
            coffee.prepareRecipe();
            tea.prepareRecipe();
        }
    }

위 전체적인 코드를 보면, 기능은 비슷하나 메소드가 다르게 정의되어 있어 전체적인 변경점이 있을 때 유지보수의 어려움을 겪을 수 있다.

Template Method 패턴을 적용한 코드를 보자

abstract class Beverage {
    final void prepareRecipe() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    }

    abstract void brew();
    abstract void addCondiments();

    void boilWater() {
    }

    void pourInCup(){
    }
}

커피와 차 클래스에서 차이를 보인 부분은 우려내는 방법과, 후에 첨가하는 재료이다. 이는 각 클래스에서 따로 구현하도록 정의하고, 공통적인(물을 끓이는 방법과 컵에 따르는)부분은 공통 클래스에서 구현한다.

class Coffee extends Beverage{
    public void addCondiments() {
    }

    public void brew() {
    }
}
class Tea extends Beverage{
    public void addCondiments() {
    }

    public void brew() {
    }
}

결과

  • 중복 코드를 최소화하여 코드 재사용을 극대화한다.
  • final 키워드를 사용하여 코드 재정의를 방지한다.

목차

 

[디자인 패턴] 개요

개요 설계 재사용에 의해 높은 생산성과 유지보수가 용시한 설계를 가능하도록 한다. 유사 객체들을 적절한 클래스로 추상화하고 인터페이스와 상속 관계를 포하한 주요 클래스 사이의 관계를

qpdh.tistory.com

 

저작자표시 (새창열림)

'이론적인거 > 디자인 패턴' 카테고리의 다른 글

[디자인 패턴] Observer 패턴  (0) 2022.12.13
[디자인 패턴] Adaptor 패턴  (0) 2022.12.13
[디자인 패턴] Singleton 패턴  (0) 2022.12.13
[디자인 패턴] 개요  (0) 2022.12.13
    '이론적인거/디자인 패턴' 카테고리의 다른 글
    • [디자인 패턴] Observer 패턴
    • [디자인 패턴] Adaptor 패턴
    • [디자인 패턴] Singleton 패턴
    • [디자인 패턴] 개요
    베오
    베오

    티스토리툴바