>  기사  >  백엔드 개발  >  한 글로 PHP 디자인 패턴의 템플릿 메소드 패턴 이해하기

한 글로 PHP 디자인 패턴의 템플릿 메소드 패턴 이해하기

齐天大圣
齐天大圣원래의
2020-08-06 17:02:391940검색

템플릿 메소드 패턴은 흔히 사용되는 디자인 패턴이기도 하며, 행동 ​​디자인 패턴이기도 합니다. 그 정의는 다음과 같습니다. 메서드에서 알고리즘의 뼈대를 정의하고 일부 단계를 하위 클래스로 연기합니다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.

Scenario

보통 주말에는 아침 늦게 일어나서 아침을 사러 나가지 않고 그냥 라면이나 라면이나 회남 쇠고기 국을 끓일 수도 있어요. . 라면이나 냉면을 담그는 단계는 동일합니다. 먼저 끓는 물을 준비한 다음 끓는 물을 사용하여 라면이나 냉면을 담근 다음 양념봉을 추가하고 마지막으로 담가야 합니다. 2~3분 동안. 완전히 동일한 두 단계(끓는 물 준비, 2~3분 동안 담가두기)가 있고, 두 단계도 유사합니다(재료를 담그고 각각의 양념 패킷 추가).

위 시나리오의 경우 인스턴트 국수 또는 뜨겁고 신 국수를 담그는 알고리즘을 정의할 수 있습니다. 이 알고리즘은 매우 간단합니다. 4단계입니다

  • 끓는 물을 준비합니다

  • 재료를 담그세요(라면 또는 냉면)

  • 양념 넣기(즉석면과 냉면은 자체 양념봉투가 있습니다)

  • 끓는 물에 2~3분간 담가둡니다

이제 템플릿 메서드 패턴을 사용하여 위의 요구 사항을 완료합니다.

먼저 특정 알고리즘과 각 단계를 정의하는 추상 클래스를 정의합니다.

abstract class Breakfast
{
    final public function prepare () {
        $this->boilWater();
        $this->brew();
        $this->addSeasoning();  
        $this->wait();
    }
    
    public function boilWater ()
    {
        echo '准备开水' . PHP_EOL;
    }
    
    // 泡食材
    abstract public function brew ();
    
    // 加调料
    abstract public function addSeasoning ();
    
    public function wait ()
    {
        echo '等待2~3分钟' . PHP_EOL;
    }
}

prepare 메소드에는 특정 알고리즘이 포함되어 있습니다. 이 메소드에 final을 추가하면 메소드가 재정의되는 것을 방지할 수 있습니다. 게다가 여기에는 미래 세대가 완성해야 할 두 가지 추상 메서드가 있다는 것을 알 수 있습니다.

다음으로 라면과 냉면 카테고리를 완성해보겠습니다. 이 두 클래스는 Breakfast를 상속한 다음 추상 메서드를 완료해야 합니다.

class Noodle extends Breakfast
{
    public function brew ()
    {
        echo '加入方便面' . PHP_EOL;
    }
    public function addSeasoning ()
    {
        echo '加入方便面的调料包' . PHP_EOL;
    }
}

class Powder extends Breakfast
{
    public function brew ()
    {
        echo '加入酸辣粉' . PHP_EOL;
    }
    public function addSeasoning ()
    {
        echo '加入酸辣粉的调料包' . PHP_EOL;
    }
}

위의 예는 일반적인 템플릿 메서드 패턴입니다. 알고리즘 뼈대는 상위 클래스에 정의되어 있으며 하위 클래스는 알고리즘의 일부 단계를 완료합니다.

Hooks

위의 예는 템플릿 메서드 패턴의 일반적인 시나리오인 재사용을 반영합니다. 재사용 외에도 템플릿 메소드 패턴은 중요한 애플리케이션 확장입니다.

템플릿 메서드 패턴은 후크를 통해 확장됩니다. 후크는 추상 클래스에 선언된 메서드이지만 비어 있거나 기본 구현이 있습니다. 후크가 있으면 하위 클래스에 알고리즘의 다양한 지점을 연결할 수 있는 기능이 제공됩니다. 연결할지 여부를 결정하는 것은 하위 클래스에 달려 있습니다.

계속해서 예를 통해 후크의 사용법을 설명하겠습니다. 저는 보통 라면을 먹을 때 햄이나 달걀을 넣습니다. 햄과 계란을 추가하는 것은 확실하지 않으므로 연결하여 서브클래스에서 햄을 추가할지 계란을 추가할지 결정하도록 할 수 있습니다.

Breakfast.php를 수정

abstract class Breakfast
{
    final public function prepare () {
        $this->boilWater();
        $this->brew();
        $this->addSeasoning();
        $this->hook();
        $this->wait();
    }
    
    
    // 省略部分方法
    
    
    // 默认不做任何事情
    public function hook () :void
    {}
}

Noodle.php를 수정하고 후크 메소드를 다시 작성

public function hook(): void
{
    echo '加入火腿和鸡蛋' . PHP_EOL;
}

템플릿 메소드 패턴 및 콜백 함수

PHP에는 템플릿 메소드 패턴이나 전략과 유사한 아이디어를 사용하는 함수가 많이 있습니다. 정렬 알고리즘을 캡슐화하는 sort() 함수와 같은 패턴이지만 특정 정렬 규칙은 콜백 함수에 의해 완성됩니다. 콜백 함수를 사용하면 추상 클래스와 하위 클래스를 만들 필요가 없어 코드 양이 크게 줄어듭니다.

템플릿 메소드 패턴, 팩토리 메소드 패턴, 전략 패턴의 관계

팩토리 메소드 패턴은 템플릿 메소드 패턴의 특별한 형태입니다.

템플릿 메서드는 상속 메커니즘을 기반으로 합니다. 즉, 하위 클래스의 콘텐츠 일부를 확장하여 알고리즘의 일부를 변경할 수 있습니다.

전략 패턴은 구성 메커니즘을 기반으로 합니다. 즉, 해당 동작에 대해 다양한 전략을 제공하여 개체 동작의 일부를 변경할 수 있습니다.

템플릿 메소드는 클래스 수준에서 작동하므로 정적입니다. 정책은 개체 수준에서 작동하므로 런타임에 동작을 전환할 수 있습니다.

위 내용은 한 글로 PHP 디자인 패턴의 템플릿 메소드 패턴 이해하기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.