PHP의 템플릿 메소드 패턴에 대한 심층 분석

青灯夜游
풀어 주다: 2023-04-10 11:50:02
앞으로
2309명이 탐색했습니다.

이전 글 "한 글로 PHP의 파사드 패턴 이해하기"에서 PHP의 파사드 패턴을 소개했습니다. 이번 글에서는 PHP 디자인 패턴의 템플릿 메소드 패턴을 이해하도록 하겠습니다.

PHP의 템플릿 메소드 패턴에 대한 심층 분석

템플릿 메소드 패턴도 우리가 무심코 자주 사용하는 패턴 중 하나입니다. 이 모델은 상속에 대한 최고의 해석입니다. 하위 클래스에 반복되는 작업이 있으면 이를 추출하여 상위 클래스에 배치하여 통합 처리합니다. 이는 템플릿 메서드 패턴에 대한 가장 간단하고 널리 알려진 설명입니다. 우리가 보통 프로젝트를 할 때와 마찬가지로 연구, 개발, 테스트, 배포, 온라인 프로세스 등 각 프로젝트의 프로세스는 실제로 동일합니다. 각 프로젝트에서 이러한 프로세스의 구현은 정확히 동일하지 않습니다. 이 프로세스는 템플릿 방법과 같아서 매번 이 프로세스에 따라 개발할 수 있습니다.

Gof 클래스 다이어그램 및 설명

GoF 정의: 작업에서 알고리즘의 골격을 정의하고 일부 단계는 하위 클래스로 연기합니다. TemplateMethod를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.

GoF 클래스 다이어그램

PHP의 템플릿 메소드 패턴에 대한 심층 분석

코드 구현

abstract class AbstractClass
{
    public function TemplateMethod()
    {
        $this->PrimitiveOperation1();
        $this->PrimitiveOperation2();
    }

    abstract public function PrimitiveOperation1();
    abstract public function PrimitiveOperation2();
}
로그인 후 복사

알고리즘 연산 메서드를 호출하는 템플릿 메서드인 TemplateMethod()로 추상 클래스를 정의합니다. 이러한 알고리즘 추상 메서드는 하위 클래스에서 구현됩니다.

class ConcreteClassA extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类A实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类A实现方法2', PHP_EOL;
    }
}

class ConcreteClassB extends AbstractClass
{
    public function PrimitiveOperation1()
    {
        echo '具体类B实现方法1', PHP_EOL;
    }
    public function PrimitiveOperation2()
    {
        echo '具体类B实现方法2', PHP_EOL;
    }
}
로그인 후 복사

특정 구현 클래스는 상위 클래스에서 정의한 알고리즘만 구현하면 됩니다.

$c = new ConcreteClassA();
$c->TemplateMethod();

$c = new ConcreteClassB();
$c->TemplateMethod();
로그인 후 복사

클라이언트 호출에서는 하위 클래스가 인스턴스화되지만 하위 클래스가 상속한 상위 클래스의 템플릿 메서드가 호출됩니다. 통합 알고리즘 호출이 가능합니다.

  • 객체 지향 개발을 해본 사람이라면 누구나 템플릿 메소드 패턴을 어느 정도 사용해 본 적이 있을 것이라고 믿습니다. 매우 일반적이기 때문입니다
  • 일부 프레임워크에는 초기화 함수가 포함된 특정 함수 클래스가 있고, 다른 많은 내부 함수가 초기화 함수에서 호출되는 경우가 있습니다. 이는 실제로 템플릿 메서드 패턴
  • 템플릿 메서드 패턴 후크 함수를 적용한 것입니다. 쉽게 구현할 수 있습니다. 오픈 소스 시스템에서 여러분을 위해 준비된 많은 템플릿이나 후크 기능과 같습니다. 예를 들어 일부 블로그 오픈 소스 프로그램은 사용자가 필요할 때 구현할 수 있도록 특정 위치에 일부 광고 공간이나 후크 기능을 예약합니다. 템플릿 방법 패턴은 알고리즘의 상수 부분을 한 번에 구현하고 가변 부분을 변환하는 데 적합합니다. 하위 클래스의 일반적인 동작을 추출하여 상위 클래스에 집중시킵니다.
  • 이 모델은 '보지 마세요'라는 원칙을 구현합니다. for us , we came to you”
회사에서는 애자일 프로젝트 관리를 적극 권장합니다. 물론 전통적인 프로젝트 관리가 나쁘다는 것은 아니지만, 단기적이고 플랫한 프로젝트 관리에는 애자일이 더 적합합니다. 우리처럼 빠른 회사죠. Agile에서는 실제로 템플릿인 Scurm 프레임워크를 사용합니다. 이는 네 가지 유형의 회의, 세 가지 유형의 사람, 세 가지 도구를 정의합니다. 각 프로젝트의 구체적인 구현에서 우리는 이러한 규칙을 준수하지만 구체적인 구현은 동일하지 않습니다. 예를 들어 일주일에 한 번 반복할 때도 있고 한 달에 한 번 반복할 때도 있습니다. 때로는 회고회의가 필요하지 않지만 회고회와 검토회의를 함께 개최하는 경우도 있습니다. 어떠한 경우에도 Scurm을 기반으로 유연한 프로젝트 개발을 진행하겠습니다. 리더로서 각 프로젝트마다 Scurm의 기본 프로세스만 불러오면 됩니다. 그러므로 회사의 강점은 모든 사람의 학습과 분리될 수 없습니다. 물론 유용한 것들을 항상 배우고 공유하고 적용해야 합니다. !

전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php

Example

더 이상 문자 메시지를 보내지 마세요. 이번에는 Cache 클래스의 초기화 부분을 구현했습니다. 위에서 언급한 일부 프레임워크의 도구 클래스와 같습니다. 일반적으로 Memcached 또는 Redis를 사용하여 Cache를 구현하므로 공개 Cache 클래스를 추출한 다음 Memcached 및 Redis의 Cache 구현 클래스가 이를 상속하도록 합니다. 공용 클래스에서는 구현 클래스의 일부 초기화 작업이 템플릿 메서드를 통해 수행됩니다. 이러한 작업은 상위 클래스에 의해 균일하게 호출됩니다. 구현 클래스는 각 단계의 특정 내용만 구현하면 됩니다.

캐시 클래스 다이어그램

PHP의 템플릿 메소드 패턴에 대한 심층 분석

전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.php

<?php

abstract class Cache
{
    private $config;
    private $conn;

    public function __construct()
    {
        $this->init();
    }
    public function init()
    {
        $this->GetConfig();
        $this->OpenConnection();
        $this->CheckConnection();
    }

    abstract public function GetConfig();
    abstract public function OpenConnection();
    abstract public function CheckConnection();
}

class MemcachedCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Memcached配置文件!&#39;, PHP_EOL;
        $this->config = &#39;memcached&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接memcached!&#39;, PHP_EOL;
        $this->conn = 1;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Memcached连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Memcached连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

class RedisCache extends Cache
{
    public function GetConfig()
    {
        echo &#39;获取Redis配置文件!&#39;, PHP_EOL;
        $this->config = &#39;redis&#39;;
    }
    public function OpenConnection()
    {
        echo &#39;链接redis!&#39;, PHP_EOL;
        $this->conn = 0;
    }
    public function CheckConnection()
    {
        if ($this->conn) {
            echo &#39;Redis连接成功!&#39;, PHP_EOL;
        } else {
            echo &#39;Redis连接失败,请检查配置项!&#39;, PHP_EOL;
        }
    }
}

$m = new MemcachedCache();

$r = new RedisCache();
로그인 후 복사
Description

  • 이런 간단한 캐시 클래스를 구현해봤습니다. 많은 프레임워크의 코드와 매우 유사합니까?
  • 하위 클래스는 자체 구현만 정의하면 되며 나머지 반복 코드는 상위 클래스에 남겨집니다. 상위 클래스가 없으면 모두 init() 메서드를 직접 구현해야 합니다
  • 물론 다른 구현도 가능합니다. 클래스를 추가해야 하는 경우에는 Cache 상위 클래스를 상속하고 자체 구현을 완료하기만 하면 됩니다. 클라이언트는 어떤 경우에도 이 클래스를 사용하려면 먼저 초기화 메서드만 호출하면 된다는 것을 알고 있기 때문에 이러한 구현 클래스를 매우 쉽게 접할 수 있습니다. 어떤 구현 클래스가 같은가요

원본 주소 : https://juejin.cn/post/6844903989348139021

저자 : Hardcore Project Manager

추천 학습 : "PHP Video Tutorial"

위 내용은 PHP의 템플릿 메소드 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:juejin.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿