이번에는 PHPDecorator 모드 사용에 대한 자세한 설명을 가져왔는데, PHP 데코레이터 모드 사용 시 주의사항은 무엇이며, 다음은 실제 사례이므로 살펴보겠습니다.
데코레이터 패턴이란
구조적 패턴 중 데코레이터 패턴은 기존 구조에 "장식"을 추가하는 패턴입니다.
Adapter 패턴은 현재 구조에 추가되는 내용입니다.
데코레이터 패턴은 클래스의 인터페이스를 고객이 기대하는 다른 인터페이스로 변환하는 어댑터 클래스입니다. 데코레이터는 래퍼라고도 합니다(어댑터와 유사).
일부 디자인 패턴에는 또 다른 추상 클래스를 상속하는 추상 클래스가 포함되어 있으며, 데코레이터도 그 중 하나입니다. 데코레이터 패턴을 사용해야 하는 경우
기본적으로 다른 객체에 영향을 주지 않고 기존 객체에 새로운 기능을 추가하려는 경우 웹사이트 형식을 만들기 위해 많은 노력을 기울였다면 데코레이터 패턴을 사용할 수 있습니다. 클라이언트와 주요 구성 요소가 완벽하게 작동하므로 클라이언트가 새로운 기능을 요청할 때 사이트를 다시 만들고 싶지 않을 것입니다. 예를 들어 클라이언트가 원래 요청한 웹 사이트를 구축했다고 가정해 보겠습니다. , 고객은 새로운 요구 사항을 갖고 웹 사이트에 비디오 기능을 포함하기를 원합니다. 원래 구성 요소를 다시 작성할 필요가 없으며 기존 구성 요소를 "장식"하고 여기에 비디오 기능을 추가하기만 하면 됩니다. 일부 프로젝트는 장식이 필요할 수도 있고 장식을 원하지 않을 수도 있습니다. 이러한 프로젝트는 기본 웹 사이트의 또 다른 중요한 기능을 구현합니다. 개발 패턴은 대부분 고객의 요구 사항을 충족할 수 있지만 일부 고객은 자신의 요구 사항을 충족하기 위해 특정 기능을 원하기도 합니다. 따라서 개발자는 고객의 비즈니스 목표를 충족하기 위해 만드는 웹 사이트를 원하거나 필요로 하지 않습니다. 데코레이터 패턴을 사용하면 핵심 기능을 제공할 수 있을 뿐만 아니라 이러한 핵심 기능을 고객이 요구하는 고유한 기능으로 "장식"할 수도 있습니다. 간단한 장식 예
웹 개발 사업에서는 몇 가지 향상된 기능을 갖춘 기본 웹 사이트를 구축할 계획입니다. 그러나 웹 개발자는 이 기본 계획이 대부분의 고객에게 적합하지만 고객이 향후 이를 더욱 향상시키고 싶어할 가능성이 높다는 것을 알고 있습니다. , 데코레이터 모드를 사용하면 여러 특정 데코레이터를 쉽게 추가할 수 있습니다. 또한 추가할 데코레이터를 선택할 수 있으므로 회사는 기능을 제어할 수 있을 뿐만 아니라 프로젝트 비용도 제어할 수 있습니다. 참여는 인터페이스입니다. 여기서는 추상 클래스 IComponent입니다. 이 추상 클래스에는 단 하나의 속성 $site와 두 개의 추상 메서드가 있습니다.참여자는 특정 구성 요소 및 데코레이터 참여 추상 클래스에 대한 인터페이스를 구체적으로 설정합니다.
IComponent .php
<?php abstract class IComponent { protected $site; abstract public function getSite(); abstract public function getPrice(); }Decorator 인터페이스
이 예제의 데코레이터 인터페이스는 여러분을 놀라게 할 것입니다. 이것은 추상 클래스이며 또한 다른 추상 클래스를 확장합니다. 이 클래스의 역할은 구성 요소 인터페이스(IComponent)를 유지하는 것입니다. IComponent를 확장하여 수행됩니다.
getSite()
和getPrice().Component
Decorator.php
<?php abstract class Decorator extends IComponent { /* 任务是维护Component的引用 继承getSite()和getPrice() 因为仍然是抽象类,所以不需要实现父类任何一个抽象方法 */ }Decorator 클래스의 주요 역할은 구성 요소 인터페이스에 대한 참조를 유지하는 것입니다.모든 데코레이터 패턴 구현에서는 구체적인 구성 요소와 데코레이터는 동일한 인터페이스를 갖습니다. 또한 구성 요소와 데코레이터에는 기본 인터페이스의
속성 및 메서드 외에도 추가 속성 및 메서드가 있을 수 있습니다.
콘크리트 구성 요소
만 있습니다. 이 예에서는 웹 사이트 이름과 기본 웹 사이트 인용문을 생성하는 특정 구성 요소 하나가 있습니다.
BasicSite.php
<?php class BasicSite extends IComponent { public function construct() { $this->site = "Basic Site"; } public function getSite() { return $this->site; } public function getPrice() { return 1200; } }두 추상 메서드 모두 직접 할당을 사용하여 구현되지만 유연성은 반영되지 않습니다. 실제로 데코레이터 값을 추가하여 "기본 사이트" 값을 변경해야 합니다.
특정 데코레이터
这个例子中的具体装饰器与具体组件有相同的接口.实际上, 它们是从Decorator抽象类(而不是IComponent类)继承了这个接口. 不过,要记住, Decorator所做的就是继承IComponent接口.
Maintenance.php
<?php class Maintenance extends Decorator { public function construct(IComponent $siteNow) { $this->site = $siteNow; } public function getSite() { $format = "<br> Maintenance"; return $this->site->getSite() . $format; } public function getPrice() { return 950 + $this->site->getPrice(); } }
这个装饰器Maintenance在改变了site的值, 还有包装的具体组件价格上还会增加它自己 的价格. 另个两个具体装饰器与Maintenance装饰器也类似
Video.php
<?php class Video extends Decorator { public function construct(IComponent $siteNow) { $this->site = $siteNow; } public function getSite() { $format = "<br> Video"; return $this->site->getSite() . $format; } public function getPrice() { return 350 + $this->site->getPrice(); } }
DataBase.php
<?php class DataBase extends Decorator { public function construct(IComponent $siteNow) { $this->site = $siteNow; } public function getSite() { $format = "<br> DataBase"; return $this->site->getSite() . $format; } public function getPrice() { return 800 + $this->site->getPrice(); } }
测试这个应用时,可以看到,在基本的价格之上还会增加各个装饰器的价格.另外还能指定装饰器名的格式, 增加了两个空格,使之缩进
装饰器实现中最重要的元素之五就是构造函数, 要为构造函数提供一个组件类型. 由于这里只有一个具体组件, 所有装饰器的实例化都会使用这个组件. 使用多个组件时, 装饰器可以包装应用中的一部分或全部组件, 也可以不包装任何组件.
客户
Client类并不是这个设计模式的一部分, 但是正确使用Client类至关重要.每个装饰器在实例化时"包装"组件, 不过, 首先必须创建一个要包装的对象, 这里是BasicSite类实例
Client.php
<?php function autoload($class_name) { include $class_name . '.php'; } class Client { private $basicSite; public function construct() { $this->basicSite = new BasicSite(); $this->basicSite = $this->WrapComponent($this->basicSite); $siteShow = $this->basicSite->getSite(); $format = "<br> <strong>Total= $"; $price = $this->basicSite->getPrice(); echo $siteShow . $format . $price . "</strong>"; } private function WrapComponent(IComponent $component) { $component = new Maintenance($component); $component = new Video($component); $component = new DataBase($component); return $component; } } $worker = new Client();
wrapComponent()
方法检查传入的BasicSite实例, 以确保参数有正确的数据类型(IComponent), 然后分别实例化3个装饰器, 对该实例对象进行装饰.
Basic Site
Maintenance
Video
DataBase
Total= $3300
适配器和装饰器模式都有另外一个名字"包装器"(wrapper)".
适配器可以"包装"一个对象, 创建一个与Adaptee兼容的接口, 而无须对它做任何修改.
装饰器也可以"包装"一个组件对象, 这样就能为这个已胡的组件增加职责, 而无须对它做任何修改.
下面的代码展示了Client如何将组件对象($component)包装在装饰器(Maintence)中:
$component = new Maintenance($component);
类似于"接口", 在计算机编程中用到"包装器"时, 不同的上下文会有不同的用法和含义. 一般来讲, 在设计模式中使用"包装器"是为了处理接口的不兼容, 或者希望为组件增加功能,包装器就表示用来减少不兼容性的策略.
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 PHP 데코레이터 패턴 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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) 쿼리 결과를 처리하고 코드의 보안 및 성능을 보장합니다.

PHP와 Python은 고유 한 장점과 단점이 있으며 선택은 프로젝트 요구와 개인 선호도에 달려 있습니다. 1.PHP는 대규모 웹 애플리케이션의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 데이터 과학 및 기계 학습 분야를 지배합니다.

PHP는 전자 상거래, 컨텐츠 관리 시스템 및 API 개발에 널리 사용됩니다. 1) 전자 상거래 : 쇼핑 카트 기능 및 지불 처리에 사용됩니다. 2) 컨텐츠 관리 시스템 : 동적 컨텐츠 생성 및 사용자 관리에 사용됩니다. 3) API 개발 : 편안한 API 개발 및 API 보안에 사용됩니다. 성능 최적화 및 모범 사례를 통해 PHP 애플리케이션의 효율성과 유지 보수 성이 향상됩니다.

PHP를 사용하면 대화식 웹 컨텐츠를 쉽게 만들 수 있습니다. 1) HTML을 포함하여 컨텐츠를 동적으로 생성하고 사용자 입력 또는 데이터베이스 데이터를 기반으로 실시간으로 표시합니다. 2) 프로세스 양식 제출 및 동적 출력을 생성하여 htmlspecialchars를 사용하여 XSS를 방지합니다. 3) MySQL을 사용하여 사용자 등록 시스템을 작성하고 Password_Hash 및 전처리 명세서를 사용하여 보안을 향상시킵니다. 이러한 기술을 마스터하면 웹 개발의 효율성이 향상됩니다.

PHP와 Python은 각각 고유 한 장점이 있으며 프로젝트 요구 사항에 따라 선택합니다. 1.PHP는 웹 개발, 특히 웹 사이트의 빠른 개발 및 유지 보수에 적합합니다. 2. Python은 간결한 구문을 가진 데이터 과학, 기계 학습 및 인공 지능에 적합하며 초보자에게 적합합니다.

PHP는 여전히 역동적이며 현대 프로그래밍 분야에서 여전히 중요한 위치를 차지하고 있습니다. 1) PHP의 단순성과 강력한 커뮤니티 지원으로 인해 웹 개발에 널리 사용됩니다. 2) 유연성과 안정성은 웹 양식, 데이터베이스 작업 및 파일 처리를 처리하는 데 탁월합니다. 3) PHP는 지속적으로 발전하고 최적화하며 초보자 및 숙련 된 개발자에게 적합합니다.


핫 AI 도구

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

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

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

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

SecList
SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

Dreamweaver Mac版
시각적 웹 개발 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구
