데코레이터 패턴을 사용하면 구조를 변경하지 않고도 기존 객체에 새로운 기능을 추가할 수 있습니다. 이 기사에서는 PHP의 데코레이터 패턴을 안내하고 데코레이터의 이점과 가장 적합한 시나리오를 소개합니다.
팩토리 패턴이 끝났으니 다른 패턴을 공부해 볼까요? 혹시 여성복을 입어보신 분 있으신가요? 여성 프로그래머가 많다고 합니다. 사실 오늘날의 데코레이터 패턴은 메이크업과 매우 유사합니다. 나는 Program Yuan MM이 여기 있다면 이 디자인 패턴을 즉시 설명할 수 있다고 믿습니다.
고프 클래스 다이어그램 및 설명
장식이라는 두 단어는 일단 메이크업으로 바꿔보겠습니다. 먼저 얼굴을 정돈한 다음 파운데이션을 바르고 화장을 하세요. 아침에 출근할 때는 옅은 화장을 해도 되고, 퇴근하고 놀러 갈 때는 짙은 화장을 해도 됩니다. . 물론 프로그래머들이 퇴근하는 시간은 공교롭게도 하반기 심야쇼 시간과 맞먹는다. 그런데 아무리 화장을 해도 얼굴은 자기 얼굴이고, 남들이 알아보지 못하는 다른 사람으로 변신할 수도 있지만, 그래도 얼굴은 자기 얼굴이다. 객체(얼굴)에 다양한 장식(화장)을 하여 얼굴을 더 돋보이게 만드는(책임감 증가) 데코레이터입니다.
GoF 정의: 기능 추가 측면에서 일부 추가 책임을 동적으로 추가하는 측면에서 데코레이터 패턴은 하위 클래스를 생성하는 것보다 더 유연합니다.
GoF 클래스 다이어그램:
코드 구현:
interface Component{ public function operation(); } class ConcreteComponent implements Component{ public function operation(){ echo "I'm face!" . PHP_EOL; } }
이는 매우 간단한 인터페이스이자 구현입니다. 여기서는 특정 구현 클래스를 얼굴로 간주합니다.
abstract class Decorator implements Component{ protected $component; public function __construct(Component $component){ $this->component = $component; } }
추상 데코레이터 클래스는 Component 인터페이스를 구현하지만 Operation() 메서드는 구현하지 않으므로 하위 클래스에서 구현할 수 있습니다. 여기서는 주로 나중에 장식할 Component에 대한 참조를 저장합니다. 위의 특정 카테고리에 맞춰 얼굴 메이크업을 준비할 예정이에요!
class ConcreteDecoratorA extends Decorator{ public $addedState = 1; // 没什么实际意义的属性,只是区别于ConcreteDecoratorB public function operation(){ echo $this->component->operation() . "Push " . $this->addedState . " cream!" . PHP_EOL; } } class ConcreteDecoratorB extends Decorator{ public function operation(){ $this->component->operation(); $this->addedBehavior(); } // 没什么实际意义的方法,只是区别于ConcreteDecoratorA public function addedBehavior(){ echo "Push 2 cream!" . PHP_EOL; } }
콘크리트 장식가 두 명. 저는 여기 크림을 두 번 발랐어요. 역시 저는 순수한 남자이고 메이크업에 대해 잘 모르는 편이에요. 첫 번째 단계는 파운데이션을 바르는 것 같죠? 하지만 이번에는 두 명의 데코레이터가 달성한 것이 얼굴에 두 겹의 서리를 바르는 것입니다.
- 특정 ConcreteComponent 객체를 패키징했다는 코드를 보면 알 수 있습니다
- 더 나아가서 실제로는 그 Operation() 메서드를 두 번, 매번 앞쪽에 패키징했습니다. 한 번에 조금씩 추가합니다
- A와 B 데코레이터에 추가된 속성과 메서드에 집착하지 마세요. 이는 GoF 클래스 다이어그램에서 두 데코레이터가 동일하지 않다는 것을 구별하기 위해 사용되는 것입니다. 다른 많은 작업을 수행할 수 있습니다. Component 객체에는 반드시 하나의 메소드(Operation())만 있는 것은 아닙니다. 객체의 메소드 전체 또는 일부를 선택적으로 꾸밀 수 있습니다. Direct 하위 클래스는 모두 다시 작성할 수 없는 것 같습니다. 이 모든 문제에? 친애하는, 결합의 개념을 이해하십시오. 우리의 데코레이터 상위 클래스에는 자체적으로 분리되는 실제 객체에 대한 참조가 포함되어 있습니다. 데코레이터를 직접 인스턴스화하여 직접 사용하지 마세요. 이해하다? 이점은 무엇입니까? 감히 기존 시스템의 클래스와 메소드를 무작위로 변경할 수 있습니까? 전 애인이 작성한 멋진 코드에 새로운 기능을 추가하고 싶다면 데코레이터를 사용해 보는 것이 좋을 것입니다. 놀라운 일이 될 것입니다!
- 이 휴대폰 일은 특정 Mi, 특정 O, 특정 Wei가 할 수 없습니다. 알았어 친구, 가서 휴대폰 케이스 만들기에 집중하세요! 자 먼저 투명한 쉘(컴포넌트)을 준비했는데 좀 보기 흉한데 어찌할 수가 없네요. 누가 저를 형편없다고 합니까? 특정 미터에 다양한 단색(DecoratorA1)을 추가하고 뒷면에 다양한 색상의 식물(DecoratorB1)을 인쇄합니다. 최근 교통 신호를 받는 특정 O의 휴대폰이 마음에 들어서 휴대폰 케이스에 다양한 색상을 사용하겠습니다. . 눈부신 색상(DecoratorA2)과 연예인 만화 아바타(DecoratorB2) 마지막으로 휴대폰이 업계 트렌드를 주도하기 시작한 것 같습니다. 이 병풍이 휴대폰 케이스 판매 사업을 망칠 것 같지 않나요? ! 알았어, 내가 안 해줄 테니까, 그냥 미 누님이랑 오 누누랑 놀아라! !
전체 코드: 데코레이터 패턴
https://github.com/zhangyue0503/designpatterns-php/blob/master/04.designator/source/ decorator.php예
계속 SMS 보내기 , 여러 SMS 운영자의 문제를 해결하기 위해 공장 모드를 사용하기 전에. 이번에는 문자 메시지 콘텐츠 템플릿의 문제를 해결해야 합니다. 홍보 문자 메시지에는 최신 광고법에 따라 '국내 1위', '세계 1위' 등의 단어를 사용할 수 없습니다. 물론 일부 야만적인 용어도 사용할 수 없습니다. 现在的情况是这样的,我们有一个很早之前的短信模板类,里面的内容是固定的,老系统依然还是使用这个模板,老系统是面对的内部员工,对语言内容的要求不高。而新系统则需要向全网发送,也就是内外部的用户都要发送。这时,我们可以用装饰器模式来对老系统的短信模板进行包装。其实说简单点,我们就是用装饰器来做文本替换的功能。好处呢?当然是可以不去改动原来的模板类中的方法就实现了对老模板内容的修改扩展等。
短信发送类图:

完整源码:短信发送装饰器方法
https://github.com/zhangyue0503/designpatterns-php/blob/master/04.decorator/source/message-decorator.php
<?php
// 短信模板接口
interface MessageTemplate
{
public function message();
}
// 假设有很多模板实现了上面的短信模板接口
// 下面这个是其中一个优惠券发送的模板实现
class CouponMessageTemplate implements MessageTemplate
{
public function message()
{
return '优惠券信息:我们是全国第一的牛X产品哦,送您十张优惠券!';
}
}
// 我们来准备好装饰上面那个过时的短信模板
abstract class DecoratorMessageTemplate implements MessageTemplate
{
public $template;
public function __construct($template)
{
$this->template = $template;
}
}
// 过滤新广告法中不允许出现的词汇
class AdFilterDecoratorMessage extends DecoratorMessageTemplate
{
public function message()
{
return str_replace('全国第一', '全国第二', $this->template->message());
}
}
// 使用我们的大数据部门同事自动生成的新词库来过滤敏感词汇,这块过滤不是强制要过滤的内容,可选择使用
class SensitiveFilterDecoratorMessage extends DecoratorMessageTemplate
{
public $bigDataFilterWords = ['牛X'];
public $bigDataReplaceWords = ['好用'];
public function message()
{
return str_replace($this->bigDataFilterWords, $this->bigDataReplaceWords, $this->template->message());
}
}
// 客户端,发送接口,需要使用模板来进行短信发送
class Message
{
public $msgType = 'old';
public function send(MessageTemplate $mt)
{
// 发送出去咯
if ($this->msgType == 'old') {
echo '面向内网用户发送' . $mt->message() . PHP_EOL;
} else if ($this->msgType == 'new') {
echo '面向全网用户发送' . $mt->message() . PHP_EOL;
}
}
}
$template = new CouponMessageTemplate();
$message = new Message();
// 老系统,用不着过滤,只有内部用户才看得到
$message->send($template);
// 新系统,面向全网发布的,需要过滤一下内容哦
$message->msgType = 'new';
$template = new AdFilterDecoratorMessage($template);
$template = new SensitiveFilterDecoratorMessage($template);
// 过滤完了,发送吧
$message->send($template);
说明
- 装饰器的最大好处:一是不改变原有代码的情况下对原有代码中的内容进行扩展,开放封闭原则;二是每个装饰器完成自己的功能,单一职责;三是用组合实现了继承的感觉;
- 最适用于:给老系统进行扩展
- 要小心:过多的装饰者会把你搞晕的
- 不一定都是对同一个方法进行装饰,其实装饰者应该更多的用于对对象的装饰,对对象进行扩展,这里我们都是针对一个方法的输出进行装饰,但仅限此文,装饰器的应用其实更加广泛
- 装饰器的特点是全部都继承自一个主接口或类,这样的好处就是返回的对象是相同的抽象数据,具有相同的行为属性,否则,就不是装饰之前的对象,而是一个新对象了
- 有点不好理解没关系,我们这次的例子其实也很勉强,这个设计模式在《Head First设计模式》中有提到Java的I/O系列接口是使用的这种设计模式:FileInputStream、LineNumberInputStream、BufferInputStream等
- Laravel框架中的中间件管道,这里其实是多种模式的综合应用,其中也应用到了装饰器模式:Laravel HTTP——Pipeline 中间件装饰者模式源码分析
- 另外在Laravel中,日志处理这里也是对Monolog进行了装饰,有兴趣的同学可以去了解下
推荐学习:《PHP视频教程》

完整源码:短信发送装饰器方法
https://github.com/zhangyue0503/designpatterns-php/blob/master/04.decorator/source/message-decorator.php
위 내용은 PHP의 데코레이터 패턴에 대한 간략한 토론의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

PHP는 동적 웹 개발 및 서버 측 응용 프로그램에 사용되는 서버 측 스크립팅 언어입니다. 1.PHP는 편집이 필요하지 않으며 빠른 발전에 적합한 해석 된 언어입니다. 2. PHP 코드는 HTML에 포함되어 웹 페이지를 쉽게 개발할 수 있습니다. 3. PHP는 서버 측 로직을 처리하고 HTML 출력을 생성하며 사용자 상호 작용 및 데이터 처리를 지원합니다. 4. PHP는 데이터베이스와 상호 작용하고 프로세스 양식 제출 및 서버 측 작업을 실행할 수 있습니다.

PHP는 지난 수십 년 동안 네트워크를 형성했으며 웹 개발에서 계속 중요한 역할을 할 것입니다. 1) PHP는 1994 년에 시작되었으며 MySQL과의 원활한 통합으로 인해 개발자에게 최초의 선택이되었습니다. 2) 핵심 기능에는 동적 컨텐츠 생성 및 데이터베이스와의 통합이 포함되며 웹 사이트를 실시간으로 업데이트하고 맞춤형 방식으로 표시 할 수 있습니다. 3) PHP의 광범위한 응용 및 생태계는 장기적인 영향을 미쳤지 만 버전 업데이트 및 보안 문제에 직면 해 있습니다. 4) PHP7의 출시와 같은 최근 몇 년간의 성능 향상을 통해 현대 언어와 경쟁 할 수 있습니다. 5) 앞으로 PHP는 컨테이너화 및 마이크로 서비스와 같은 새로운 도전을 다루어야하지만 유연성과 활발한 커뮤니티로 인해 적응력이 있습니다.

PHP의 핵심 이점에는 학습 용이성, 강력한 웹 개발 지원, 풍부한 라이브러리 및 프레임 워크, 고성능 및 확장 성, 크로스 플랫폼 호환성 및 비용 효율성이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 웹 서버와 우수한 통합 및 여러 데이터베이스를 지원합니다. 3) Laravel과 같은 강력한 프레임 워크가 있습니다. 4) 최적화를 통해 고성능을 달성 할 수 있습니다. 5) 여러 운영 체제 지원; 6) 개발 비용을 줄이기위한 오픈 소스.

PHP는 죽지 않았습니다. 1) PHP 커뮤니티는 성능 및 보안 문제를 적극적으로 해결하고 PHP7.x는 성능을 향상시킵니다. 2) PHP는 최신 웹 개발에 적합하며 대규모 웹 사이트에서 널리 사용됩니다. 3) PHP는 배우기 쉽고 서버가 잘 수행되지만 유형 시스템은 정적 언어만큼 엄격하지 않습니다. 4) PHP는 컨텐츠 관리 및 전자 상거래 분야에서 여전히 중요하며 생태계는 계속 발전하고 있습니다. 5) Opcache 및 APC를 통해 성능을 최적화하고 OOP 및 설계 패턴을 사용하여 코드 품질을 향상시킵니다.

PHP와 Python에는 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구 사항에 따라 다릅니다. 1) PHP는 웹 개발, 배우기 쉽고 풍부한 커뮤니티 리소스에 적합하지만 구문은 현대적이지 않으며 성능과 보안에주의를 기울여야합니다. 2) Python은 간결한 구문과 배우기 쉬운 데이터 과학 및 기계 학습에 적합하지만 실행 속도 및 메모리 관리에는 병목 현상이 있습니다.

PHP는 동적 웹 사이트를 구축하는 데 사용되며 해당 핵심 기능에는 다음이 포함됩니다. 1. 데이터베이스와 연결하여 동적 컨텐츠를 생성하고 웹 페이지를 실시간으로 생성합니다. 2. 사용자 상호 작용 및 양식 제출을 처리하고 입력을 확인하고 작업에 응답합니다. 3. 개인화 된 경험을 제공하기 위해 세션 및 사용자 인증을 관리합니다. 4. 성능을 최적화하고 모범 사례를 따라 웹 사이트 효율성 및 보안을 개선하십시오.

PHP는 MySQLI 및 PDO 확장 기능을 사용하여 데이터베이스 작업 및 서버 측 로직 프로세싱에서 상호 작용하고 세션 관리와 같은 기능을 통해 서버 측로 로직을 처리합니다. 1) MySQLI 또는 PDO를 사용하여 데이터베이스에 연결하고 SQL 쿼리를 실행하십시오. 2) 세션 관리 및 기타 기능을 통해 HTTP 요청 및 사용자 상태를 처리합니다. 3) 트랜잭션을 사용하여 데이터베이스 작업의 원자력을 보장하십시오. 4) SQL 주입 방지, 디버깅을 위해 예외 처리 및 폐쇄 연결을 사용하십시오. 5) 인덱싱 및 캐시를 통해 성능을 최적화하고, 읽을 수있는 코드를 작성하고, 오류 처리를 수행하십시오.

PHP에서 전처리 문과 PDO를 사용하면 SQL 주입 공격을 효과적으로 방지 할 수 있습니다. 1) PDO를 사용하여 데이터베이스에 연결하고 오류 모드를 설정하십시오. 2) 준비 방법을 통해 전처리 명세서를 작성하고 자리 표시자를 사용하여 데이터를 전달하고 방법을 실행하십시오. 3) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

WebStorm Mac 버전
유용한 JavaScript 개발 도구

MinGW - Windows용 미니멀리스트 GNU
이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

VSCode Windows 64비트 다운로드
Microsoft에서 출시한 강력한 무료 IDE 편집기
