이전 글 "한 글로 PHP의 파사드 패턴 이해하기"에서 PHP의 파사드 패턴을 소개했습니다. 이번 글에서는 PHP 디자인 패턴의 템플릿 메소드 패턴을 이해하도록 하겠습니다.
템플릿 메소드 패턴도 우리가 무심코 자주 사용하는 패턴 중 하나입니다. 이 모델은 상속에 대한 최고의 해석입니다. 하위 클래스에 반복되는 작업이 있으면 이를 추출하여 상위 클래스에 배치하여 통합 처리합니다. 이는 템플릿 메서드 패턴에 대한 가장 간단하고 널리 알려진 설명입니다. 우리가 보통 프로젝트를 할 때와 마찬가지로 연구, 개발, 테스트, 배포, 온라인 프로세스 등 각 프로젝트의 프로세스는 실제로 동일합니다. 각 프로젝트에서 이러한 프로세스의 구현은 정확히 동일하지 않습니다. 이 프로세스는 템플릿 방법과 같아서 매번 이 프로세스에 따라 개발할 수 있습니다.
GoF 정의: 작업에서 알고리즘의 골격을 정의하고 일부 단계는 하위 클래스로 연기합니다. TemplateMethod를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있습니다.
GoF 클래스 다이어그램
코드 구현
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();
클라이언트 호출에서는 하위 클래스가 인스턴스화되지만 하위 클래스가 상속한 상위 클래스의 템플릿 메서드가 호출됩니다. 통합 알고리즘 호출이 가능합니다.
전체 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method.php
Example
전체 소스 코드: https://github.com/zhangyue0503/designpatterns-php/blob/master/20.template-method/source/template-method-cache.php
Description<?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 '获取Memcached配置文件!', PHP_EOL; $this->config = 'memcached'; } public function OpenConnection() { echo '链接memcached!', PHP_EOL; $this->conn = 1; } public function CheckConnection() { if ($this->conn) { echo 'Memcached连接成功!', PHP_EOL; } else { echo 'Memcached连接失败,请检查配置项!', PHP_EOL; } } } class RedisCache extends Cache { public function GetConfig() { echo '获取Redis配置文件!', PHP_EOL; $this->config = 'redis'; } public function OpenConnection() { echo '链接redis!', PHP_EOL; $this->conn = 0; } public function CheckConnection() { if ($this->conn) { echo 'Redis连接成功!', PHP_EOL; } else { echo 'Redis连接失败,请检查配置项!', PHP_EOL; } } } $m = new MemcachedCache(); $r = new RedisCache();로그인 후 복사
- 이런 간단한 캐시 클래스를 구현해봤습니다. 많은 프레임워크의 코드와 매우 유사합니까?
- 하위 클래스는 자체 구현만 정의하면 되며 나머지 반복 코드는 상위 클래스에 남겨집니다. 상위 클래스가 없으면 모두 init() 메서드를 직접 구현해야 합니다
- 물론 다른 구현도 가능합니다. 클래스를 추가해야 하는 경우에는 Cache 상위 클래스를 상속하고 자체 구현을 완료하기만 하면 됩니다. 클라이언트는 어떤 경우에도 이 클래스를 사용하려면 먼저 초기화 메서드만 호출하면 된다는 것을 알고 있기 때문에 이러한 구현 클래스를 매우 쉽게 접할 수 있습니다. 어떤 구현 클래스가 같은가요
원본 주소 : https://juejin.cn/post/6844903989348139021
저자 : Hardcore Project Manager
추천 학습 : "PHP Video Tutorial"
위 내용은 PHP의 템플릿 메소드 패턴에 대한 심층 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!