이번에는 PHPDecorator 모드 사용에 대한 자세한 설명을 가져왔는데, PHP 데코레이터 모드 사용 시 주의사항은 무엇이며, 다음은 실제 사례이므로 살펴보겠습니다.
데코레이터 패턴이란
구조적 패턴 중 데코레이터 패턴은 기존 구조에 "장식"을 추가하는 패턴입니다.
Adapter 패턴은 현재 구조에 추가되는 내용입니다.
데코레이터 패턴은 클래스의 인터페이스를 고객이 기대하는 다른 인터페이스로 변환하는 어댑터 클래스입니다. 데코레이터는 래퍼라고도 합니다(어댑터와 유사).
일부 디자인 패턴에는 또 다른 추상 클래스를 상속하는 추상 클래스가 포함되어 있으며, 데코레이터도 그 중 하나입니다. 데코레이터 패턴을 사용해야 하는 경우
기본적으로 다른 객체에 영향을 주지 않고 기존 객체에 새로운 기능을 추가하려는 경우 웹사이트 형식을 만들기 위해 많은 노력을 기울였다면 데코레이터 패턴을 사용할 수 있습니다. 클라이언트와 주요 구성 요소가 완벽하게 작동하므로 클라이언트가 새로운 기능을 요청할 때 사이트를 다시 만들고 싶지 않을 것입니다. 예를 들어 클라이언트가 원래 요청한 웹 사이트를 구축했다고 가정해 보겠습니다. , 고객은 새로운 요구 사항을 갖고 웹 사이트에 비디오 기능을 포함하기를 원합니다. 원래 구성 요소를 다시 작성할 필요가 없으며 기존 구성 요소를 "장식"하고 여기에 비디오 기능을 추가하기만 하면 됩니다. 일부 프로젝트는 장식이 필요할 수도 있고 장식을 원하지 않을 수도 있습니다. 이러한 프로젝트는 기본 웹 사이트의 또 다른 중요한 기능을 구현합니다. 개발 패턴은 대부분 고객의 요구 사항을 충족할 수 있지만 일부 고객은 자신의 요구 사항을 충족하기 위해 특정 기능을 원하기도 합니다. 따라서 개발자는 고객의 비즈니스 목표를 충족하기 위해 만드는 웹 사이트를 원하거나 필요로 하지 않습니다. 데코레이터 패턴을 사용하면 핵심 기능을 제공할 수 있을 뿐만 아니라 이러한 핵심 기능을 고객이 요구하는 고유한 기능으로 "장식"할 수도 있습니다. 간단한 장식 예
웹 개발 사업에서는 몇 가지 향상된 기능을 갖춘 기본 웹 사이트를 구축할 계획입니다. 그러나 웹 개발자는 이 기본 계획이 대부분의 고객에게 적합하지만 고객이 향후 이를 더욱 향상시키고 싶어할 가능성이 높다는 것을 알고 있습니다. , 데코레이터 모드를 사용하면 여러 특정 데코레이터를 쉽게 추가할 수 있습니다. 또한 추가할 데코레이터를 선택할 수 있으므로 회사는 기능을 제어할 수 있을 뿐만 아니라 프로젝트 비용도 제어할 수 있습니다. 참여는 인터페이스입니다. 여기서는 추상 클래스 IComponent입니다. 이 추상 클래스에는 단 하나의 속성 $site와 두 개의 추상 메서드가 있습니다.참여자는 특정 구성 요소 및 데코레이터 참여 추상 클래스에 대한 인터페이스를 구체적으로 설정합니다.
IComponent .php
<?php abstract class IComponent { protected $site; abstract public function getSite(); abstract public function getPrice(); }
이 예제의 데코레이터 인터페이스는 여러분을 놀라게 할 것입니다. 이것은 추상 클래스이며 또한 다른 추상 클래스를 확장합니다. 이 클래스의 역할은 구성 요소 인터페이스(IComponent)를 유지하는 것입니다. IComponent를 확장하여 수행됩니다.
getSite()
和getPrice().Component
Decorator.php
<?php abstract class Decorator extends IComponent { /* 任务是维护Component的引用 继承getSite()和getPrice() 因为仍然是抽象类,所以不需要实现父类任何一个抽象方法 */ }
속성 및 메서드 외에도 추가 속성 및 메서드가 있을 수 있습니다.
콘크리트 구성 요소
만 있습니다. 이 예에서는 웹 사이트 이름과 기본 웹 사이트 인용문을 생성하는 특정 구성 요소 하나가 있습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!