프로그래밍/Php

Template Method pattern (템플릿 메소드 패턴)

소행성왕자 2020. 6. 1. 15:26

템플릿 메소드 패턴이란?

본 내용은 본인이 지식습득과정에서 연습하기 위한 내용입니다.

 

보통 클래스를 상속으로 사용하는데 있어서 제어 역전으로 사용합니다. 

예를 들면 부모클래스 1개  와 자식클래스 10개 가 있다라고 가정하다면

부모클래스가 수정이 된다면 그 여파는 자식클래스 10개에 전파가 됩니다. 

 

이러한 일을 방지하기 위해서 템플릿 메소드 패턴을 사용합니다. 

아래는 이해를 돕기 위한 소스코드 입니다.

 

<?php

/**
 * Created by naya@coforward.com on 2020/06/01
 */

/**
 *  Template Method pattern
 *
 */

abstract class Journey
{
    private $thingsToDo = [];

    final public function takeATrip()
    {
        $this->thingsToDo[] = $this->buyAFlight();
        $this->thingsToDo[] = $this->takePlane();
        $this->thingsToDo[] = $this->enjoyVacation();
        $buyGift            = $this->buyGift();

        if ($buyGift != null) {
            $this->thingsToDo[] = $buyGift;
        }

        $this->thingsToDo[] = $this->takePlane();
    }

    abstract protected function enjoyVacation(): string;

    protected function buyGift(): ?string
    {
        return null;
    }

    private function buyAFlight(): string
    {
        return 'Journey : 항공권 구매 ';
    }

    private function takePlane(): string
    {
        return 'Journey : 비행기 타다 ';
    }

    public function getThingsToDo(): array
    {
        return $this->thingsToDo;
    }
}

class BeachJourney extends Journey
{

    protected function enjoyVacation(): string
    {
        // TODO: Implement enjoyVacation() method.
        return "BeachJourney: 수영과 일광욕";
    }
}

class CityJourney extends Journey
{

    protected function enjoyVacation(): string
    {
        // TODO: Implement enjoyVacation() method.
        return "CityJourney : 먹고 마시고 사진 찍고 자기";
    }

    protected function buyGift(): ?string
    {
        return "CityJourney : 선물을 산다.";
    }
}


$beachJourney = new BeachJourney();
$beachJourney->takeATrip();

$cityJourney = new CityJourney();
$cityJourney->takeATrip();

$a = $beachJourney->getThingsToDo();
$b = $cityJourney->getThingsToDo();

echo '<pre>';
print_r($a);
print_r($b);
exit;



Array
(
    [0] => Journey : 항공권 구매 
    [1] => Journey : 비행기 타다 
    [2] => BeachJourney: 수영과 일광욕
    [3] => Journey : 비행기 타다 
)
Array
(
    [0] => Journey : 항공권 구매 
    [1] => Journey : 비행기 타다 
    [2] => CityJourney : 먹고 마시고 사진 찍고 자기
    [3] => CityJourney : 선물을 산다.
    [4] => Journey : 비행기 타다 
)


 

"항공권 구매" 와 "비행기 타다" 는 

여행을 가기 위해서 필수 조건이라 부모클래스에서 정의 했습니다.

하지만 여행가서 쇼핑하는사람 / 휴식하는사람 / 또다는 무언가를 하는 사람 등등 으로 나눌수가 있습니다.

 

그리하여 부모 추상클래스에

  항공권 구매 : buyAFlight()  

  비행기 타다 : takePlane()

는 공통으로 두고 

 

abstract protected function enjoyVacation() 메소드를 통해 자식클래스에서 구현하기로 합니다.

또한 선물 구입하는것도 사용자 별로 다르기 때문에

부모클래스에서는 기본 null 값으로 셋팅해주고

실세 구현은 자식클래스에 서 구현해줍니다.