【디자인 패턴】PHP로 Template Method 패턴의 실장을 해 보았다

환경


  • PHP 7.2.18

  • Template Method 패턴이란?



    Template라고 하는 것은, 자주(잘) 여러가지 사람이 「템플리」등이라고 약하는 그렇습니다.
    메일등의 정형문이나, 작품의 베이스가 되는 편지지 등의 「정해진 양식」을 가리키는 것이 많네요.
    Template Method 패턴의 이름의 유래도 거기에서 와 있어, 정해진 처리의 흐름등을 추상 클래스로 「틀」로서 정해, 구체적인 구현의 내용은 구상 클래스로 구현하는 것이 됩니다.



    Template Method 패턴은 무엇이 좋은가?



    Template Method 패턴을 사용하면 비슷한 처리와 반복적으로 사용되는 처리를 공통화할 수 있습니다.
    함수에 의한 처리의 공통화를 하는 일도 있다고는 생각합니다만, 클래스에서 그것을 하는 것이 Template Method 패턴이라고 하는 곳입니다.

    예제 개요



    예로서 간단한 프로그램을 만들었습니다.
    「새의 정보를 돌려준다」템플릿에 대해서, 구체적인 새의 클래스(까마귀, 펭귄, 타조)를 구현해 처리를 공통화시켰습니다.
    마지막으로 각 새의 정보를 표에 표시합니다.
    이미지 다이어그램과 클래스 다이어그램입니다.

    이미지 다이어그램





    클래스 다이어그램





    파일 구성





    소스 코드



    구현



    우선, 템플릿인 추상 클래스의 정의



    이번 구현에서 공통이 되는 처리는, 각각의 오브젝트(새들)의 「종류」 「이름」 「출산 방법」 「이동 수단」의 정보를 이 차례로 돌려주는 처리입니다.
    「종류」나 「출산 방법」등의, 새이면 공통이 되는 정보는, 추상 클래스로 구현해 버리고 있습니다.
    그 외의 새의 종류마다 변화하는 「이름」이나 「이동 수단」에 관해서는, 구체적인 실장을 구상 클래스에 맡기고 있습니다.

    AbstractBird.php
    <?php
    
    abstract class AbstractBird {
        private $birdInfo;
    
        final public function getInfo() {
            $this->birdInfo['type'] = $this->getType();
            $this->birdInfo['name'] = $this->getName();
            $this->birdInfo['birthType'] = $this->getBirthType();
            $this->birdInfo['howToMovement'] = $this->gethowToMovement();
            return $this->birdInfo;
        }
    
        final private function getType() {
            return '鳥類';
        }
    
        protected abstract function getName();
    
        final private function getBirthType() {
            return '卵生';
        }
    
        protected abstract function gethowToMovement();
    }
    
    ?>
    
    

    이 후에는, 이 추상 클래스를 계승한 구상 클래스로 구체적인 구현을 해 갑니다.

    다음은 구상 클래스(까마귀 클래스 등)의 준비



    추상 클래스인 「새」클래스가 생겼으므로, 이후에는 그 구체적인 구현을 기입하는 「까마귀 클래스」등의 구상 클래스를 작성해 갑니다.
    「이름」이나 「이동 수단」등의, 「새」의 종류에 의해 각각 바뀌는 정보는, 각각의 새의 종류의 클래스에 구현합니다.
    이번에는 까마귀 클래스/펭귄 클래스/타조 클래스를 만들었습니다.

    Crow.php
    <?php
    namespace Birds;
    require_once('./AbstractBird.php');
    use AbstractBird;
    
    class Crow extends AbstractBird {
    
        final protected function getName() {
            return 'カラス ';
        }
    
        final protected function gethowToMovement() {
            return '飛ぶ';
        }
    }
    
    ?>
    
    

    Penguin.php
    <?php
    namespace Birds;
    require_once('./AbstractBird.php');
    use AbstractBird;
    
    class Penguin extends AbstractBird {
    
        final protected function getName() {
            return 'ペンギン';
        }
    
        final protected function gethowToMovement() {
            return '泳ぐ';
        }
    }
    
    ?>
    
    

    Ostrich.php
    <?php
    namespace Birds;
    require_once('./AbstractBird.php');
    use AbstractBird;
    
    class Ostrich extends AbstractBird {
    
        final protected function getName() {
            return 'ダチョウ';
        }
    
        final protected function gethowToMovement() {
            return '走る';
        }
    }
    
    ?>
    
    

    그리고는, 이 구상 클래스를 실제로 new 하고 데이터를 취득해 표시해 완료입니다!

    각 구체적인 클래스를 실행하여 정보 표시



    마지막으로 각각의 클래스를 new 하고 데이터를 취득해 표시합니다.
    추상 클래스에서 처리를 공통화하고 있기 때문에 같은 처리를 이렇게 간단하게 관리할 수 있습니다.

    index.php
    <?php
    require_once('./Birds/Ostrich.php');
    require_once('./Birds/Penguin.php');
    require_once('./Birds/Crow.php');
    use Birds\Ostrich;
    use Birds\Penguin;
    use Birds\Crow;
    
    $Ostrich = (new Ostrich)->getInfo();
    $Penguin = (new Penguin)->getInfo();
    $Crow    = (new Crow)->getInfo();
    
    
    ?>
    
    <?php
    echo "<table border = '1'>";
    echo "   <tr>";
    echo "        <th>種類</th>";
    echo "        <th>名前</th>";
    echo "        <th>出産方法</th>";
    echo "        <th>移動手段</th>";
    echo "    </tr>";
    echo "    <tr>";
    echo "        <th>$Ostrich[type]</th>";
    echo "        <th>$Ostrich[name]</th>";
    echo "        <th>$Ostrich[birthType]</th>";
    echo "        <th>$Ostrich[howToMovement]</th>";
    echo "    </tr>";
    echo "</table>";
    ?>
    
    <?php
    echo "<table border = '1'>";
    echo "   <tr>";
    echo "        <th>種類</th>";
    echo "        <th>名前</th>";
    echo "        <th>出産方法</th>";
    echo "        <th>移動手段</th>";
    echo "    </tr>";
    echo "    <tr>";
    echo "        <th>$Penguin[type]</th>";
    echo "        <th>$Penguin[name]</th>";
    echo "        <th>$Penguin[birthType]</th>";
    echo "        <th>$Penguin[howToMovement]</th>";
    echo "    </tr>";
    echo "</table>";
    ?>
    
    <?php
    echo "<table border = '1'>";
    echo "   <tr>";
    echo "        <th>種類</th>";
    echo "        <th>名前</th>";
    echo "        <th>出産方法</th>";
    echo "        <th>移動手段</th>";
    echo "    </tr>";
    echo "    <tr>";
    echo "        <th>$Crow[type]</th>";
    echo "        <th>$Crow[name]</th>";
    echo "        <th>$Crow[birthType]</th>";
    echo "        <th>$Crow[howToMovement]</th>";
    echo "    </tr>";
    echo "</table>";
    ?>
    
    

    브라우저 확인



    이런 느낌으로 표시되었습니다! 완성!

    좋은 웹페이지 즐겨찾기