> 백엔드 개발 > PHP 튜토리얼 > PHP 객체지향 고급 디자인 패턴: 데코레이터 패턴

PHP 객체지향 고급 디자인 패턴: 데코레이터 패턴

巴扎黑
풀어 주다: 2023-03-07 20:02:01
원래의
1758명이 탐색했습니다.

데코레이터 패턴이란 무엇인가요?

기존 객체의 일부나 기능에 변화가 있지만 원래 객체의 구조를 수정할 필요가 없다면 데코레이터 디자인 패턴이 가장 적합합니다.

데코레이터 패턴 적용 문제 및 해결 방법:

객체 지향 프로그래밍을 처음 배울 때 가장 먼저 겪는 장애물은 상속 관계에서 부모-자식 관계를 이해하는 것입니다. . 시간이 지남에 따라 우리는 이 프로그래밍 방법에 더 익숙해질 것입니다. 새로운 도전에 직면했을 때 숙련된 객체 지향 프로그래머는 즉시 객체에 더 많은 기능을 확장합니다. 그러나 모든 것에는 정도가 있는 것처럼 적당한 사용만이 이러한 종류의 작업의 좋은 발전을 보장할 수 있습니다.

코드 베이스에는 클래스 계층 수에 제한이 있어야 합니다. 객체에 너무 많은 하위 클래스가 필요하기 시작하면 해당 코드는 프로그래머의 이해와 유지 관리 가능성을 희생합니다. 일반적으로 나는 개체에 대해 상위-하위 관계가 3개 이하인지 확인하려고 노력합니다. 더 많은 부모-자식 관계가 생성되면 코드가 혼란스럽고 제어할 수 없게 된다는 것을 발견했습니다. 또한 일반 종이를 사용하면 애플리케이션의 개체에 대한 UML 다이어그램 표현을 생성할 수 없습니다.

하지만 클래스 확장 사용을 막고 싶지는 않습니다. 실제로 우리는 적절한 솔루션을 사용하여 객체를 확장하는 경우가 많습니다. 그러나 일부 문제의 경우 데코레이터 디자인 패턴을 기반으로 하는 클래스를 사용하는 것이 더 나은 솔루션입니다.

Decorator 디자인 패턴은 프로그래머가 많은 시간을 보내는 상황에 적합합니다. 변경 사항은 빠르고 작으며 나머지 애플리케이션에 거의 영향을 미치지 않습니다. 데코레이터 디자인 패턴을 사용하여 클래스를 디자인하는 목표는 기존 기능을 재정의하지 않고도 기본 개체에 점진적인 변경 사항을 적용하는 것입니다. 데코레이터는 다른 코드 흐름에 영향을 주지 않고 기본 코드 흐름에 직접 대상 개체를 변경하거나 "장식"하는 하나 이상의 데코레이터를 삽입할 수 있는 방식으로 구축되었습니다.

UML

다음 UML 다이어그램은 데코레이터 디자인 패턴을 사용한 클래스 디자인을 자세히 설명합니다.

PHP 객체지향 고급 디자인 패턴: 데코레이터 패턴

위 그림에 대한 설명은 다음과 같습니다.

1.MyObject는 기존 기능이 포함된 기본 클래스입니다. 이 클래스에는 items라는 공용 배열과 show ItemsFormatted()라는 공용 메서드가 포함되어 있습니다.

2. show ItemsFormatted() 메소드는 항목 배열을 승인하고, 사전 정의된 기능을 사용하여 배열 형식을 지정하고 출력을 제출하는 역할을 합니다.

3. MyObjectDecorator 클래스에는 MyObject의 전용 인스턴스와 MyObjectDecorator() 및 DecorItems()라는 두 개의 공용 메서드가 포함되어 있습니다.

4. MyObjectDecorator() 메서드는 MyObject 유형 매개변수를 받아 내부적으로 저장하는 생성자를 나타냅니다.

5. DecorItems() 메서드는 MyObject 인스턴스의 항목 배열을 수정할 수 있습니다.

다음 예를 살펴보겠습니다. 면적의 값을 계산하기 위해 다음과 같이 코드를 작성합니다.

// 区域抽象类
abstract class Area
{
    abstract public function treasure();
}
//森林类,价值100
class Forest extends Area 
{
    public function treasure()
    {
        return 100;
    }
}
//沙漠类,价值10
class Desert extends Area
{
    function function treasure()
    {
        return 10;
    }
}
로그인 후 복사

위 코드는 문제가 없을 것 같지만, 파괴된 숲의 가치를 계산하려면 어떻게 해야 합니까? DamageForest 하위 클래스를 추가해야 합니까? 분명히 이는 실현 가능하지 않습니다. 왜냐하면 유형이 겹치는 다른 클래스가 많이 있을 가능성이 높기 때문입니다. 이로 인해 클래스 및 점점 더 많은 하위 클래스에 중복 코드가 발생하게 됩니다.

데코레이터 패턴은 위의 문제를 해결하기 위해 상속 대신 구성과 위임을 사용합니다. 다음 개선된 코드를 살펴보겠습니다.

// 区域抽象类
abstract class Area
{    
   abstract public function treasure();
}

//森林类,价值100
class Forest extends Area 
{
   public function treasure()
   {
       return 100;
   }
}
//沙漠类,价值10
class Desert extends Area
{
   function function treasure()
   {
       return 10;
   }
}
//区域类的装饰器类
abstract class AreaDecorateor extends Area
{
   protected $_area = null;

   public function __construct(Area $area)
   {
       $this->_area = $area;
   }
}

//被破坏了后的区域,价值只有之前的一半
class Damaged extends AreaDecorateor
{
   public function treasure()
   {
       return $this->_area->treasure() * 0.5;
   }
}

//现在我们来获取被破坏的森林类的价值
$damageForest = new Damaged(new Forest());
echo $damageForest->treasure();  //返回50
로그인 후 복사

위 내용은 PHP 객체지향 고급 디자인 패턴: 데코레이터 패턴의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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