템플릿 메소드 패턴

런던행·2020년 8월 13일
0

디자인 패턴

목록 보기
6/8

템플릿 메소드 패턴은 해동 디자인 패턴의 한 종류로 애플리케이션의 뼈대나 핵심 알고리즘을 템플릿 메소드에 정의한다.

템플릿 메소드 패턴은 다음과 같은 상황에 적합하다.

  • 여러 알고리즘 또는 클래스가 비슷하거나 같은 로직을 구현할 때

  • 알고리즘을 단계별로 서브클래스화해 코드의 중복을 줄일 수 있는 경우

  • 서브클래스를 오버라이드해 여러 알고리즘을 구현할 수 있는 경우

    커피 끓이는 순서
    차를 끓이는 순서
    => 단계별로 구분 지어 생각해보면 공통점이 많다.

템플릿 메소드 패턴 이해

템플릿 메소드 패턴의 목적은 다음과 같다

  • 알고리즘 뼈대를 원시 연산으로 구현
  • 알고리즘 구조를 수정하지 않고 일부 서브클래스를 재정의
  • 코드의 재사용과 중복 최소화
  • 공통 인터페이스 및 구현 활용

템플릿 메소드 패턴에는 ABstractClass와 ConcreteClass, Template Method, Clinet가 있다.

  • AbstractClass: 알고리즘의 단계를 정의하는 인터페이스
  • ConcreteClass: 단계별 서브클래스
  • template_method(): 단계별 메소드를 호출하는 알고리즘 정의

패턴 사용 사례

여행사는 여러 여행지 중에 고객에 맞는 패키지를 만들어 추천한다. 패키지는 고객이 선택한다. 패키지에는 바우문할 장소들과 교통수단 등의 여러 정보와 일정이 있다. 같은 여행지라도 고객의 요구에 맞게 일정을 바꿀 수 있다.

  • 여행을 정의하는 AbstractClass 생성한다.
  • 주말을 활용한 2박3일 일정이라면 일별(day1, day2, day3) 방문지와 대중교통, 돌아오는 일정 등을 정의하는 여러 추상메소드가 필요하다.
  • itinerary() 템플릿 메소드는 여행 일정을 정의한다.
  • ConcreateClass를 고객의 취향에 맞게 일정을 변경한다.

시나리오

  • Trop 클래스는 추상객체로 표현한다. 교통수단 및 일별 방문지 등에 대한 정보를 정의하는 인터페이스 또는 파이썬의 추상 기본 클래스다
  • setTransport는 ConcreateClass가 구현해야 하는 교통수단을 지정하는 추상메소드
  • day1(), day2(), day3() 추상메소드는 일별 일정을 설정한다.
  • itinerary() 템플릿 메소드는 전체 일정을 생성한다. 호출 순서는 교통순단과 방문지를 지정하고 returnHome순이다.
from abc import abstractmethod, ABCMeta

class Trip(metaclass=ABCMeta):

    @abstractmethod
    def setTransport(self):
        pass

    @abstractmethod
    def day1(self):
        pass

    @abstractmethod
    def day2(self):
        pass

    @abstractmethod
    def day3(self):
        pass


    @abstractmethod
    def returnHome(self):
        pass

    def itinerary(self):
        self.setTransport()
        self.day1()
        self.day2()
        self.day3()

        self.returnHome()

구상클래스

  • VeniceTrip과 MaldivesTrip은 Trip 인터페이스를 구현하는 구상클래스다.
  • 각 구상클래스는 여행객의 취향에 맞게 선택될 여행지를 나타낸다.
  • VeniceTrip과 MaldivesTrip은 setTransport()와 day1(), day2(), day3(), returnHome()을 구현한다.
class VeniceTrip(Trip):

    def setTransport(self):
        print("take a boat")

    def day1(self):
        print("visit a1")

    def day2(self):
        print("visit a2")

    def day3(self):
        print("visit a3")

    def returnHome(self):
        print("get back")



class MaldiversTrip(Trip):

    def setTransport(self):
        print("take a car")

    def day1(self):
        print("visit b1")

    def day2(self):
        print("visit b2")

    def day3(self):
        print("visit b3")

    def returnHome(self):
        print("go bus station")

활용 코드

class TravelAgency:

    def arrage_trip(self):
        choice = input("What kind of place you'd like to go historical or to beach")

        if choice == 'historical':
            self.trip = VeniceTrip()
            self.trip.itinerary()

        else:
            self.trip = MaldiversTrip()
            self.trip.itinerary()


TravelAgency().arrage_trip()

What kind of place you'd like to go historical or to beach : historical
take a car
visit b1
visit b2
visit b3
go bus station

profile
unit test, tdd, bdd, laravel, django, android native, vuejs, react, embedded linux, typescript

0개의 댓글