프로그래밍/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 값으로 셋팅해주고

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