템플릿 메소드 패턴이란?
본 내용은 본인이 지식습득과정에서 연습하기 위한 내용입니다.
보통 클래스를 상속으로 사용하는데 있어서 제어 역전으로 사용합니다.
예를 들면 부모클래스 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 값으로 셋팅해주고
실세 구현은 자식클래스에 서 구현해줍니다.
'프로그래밍 > Php' 카테고리의 다른 글
한번 포스팅으로 워드프레스 / 그누보드 / XE / 티스토리 에 동시에 배포 (0) | 2020.07.30 |
---|---|
유머 커뮤니티 크롤링/파싱 시 본문내용이 안나올때 (0) | 2020.07.29 |
고차원 함수 array_map 과 array_reduce 를 이용한 배열을 문자열로 변환 (0) | 2020.05.28 |
array_walk 를 이용한 배열을 쿼리스트링으로 변경 (0) | 2020.05.28 |
[디자인패턴] php 로 알아보는 Builder pattern (0) | 2020.04.24 |