PHP 디자인 모드 - 장식자 모드

2443 단어
  • 상속 사용하지 않음
  • 동적 확장
  • 원래의 종류를 바꾸지 않음
  • 는 구조형 모델로 한 대상에게 동태적으로 추가 직책을 추가한다.기능을 추가하는 데 있어서, Decorator 모드는 하위 클래스를 생성하는 것보다 더욱 유연하다.
    장식 모델은 고객에게 투명한 방식으로 한 대상에게 동태적으로 더 많은 직책을 부가하는 것이다.클라이언트가 대상이 장식 전과 장식 후의 차이를 느끼지 않는다는 것이다.장식 모델은 더 많은 자류를 창조하는 것을 사용하지 않고 대상의 기능을 확장할 수 있다.
    주역
  • 추상 구성 요소(Component) 역할: 대상 인터페이스를 정의하여 추가 직책을 받을 대상을 규범화하고 이 대상에게 동태적으로 직책을 추가할 수 있다.
  • 구체적 구성 요소(Concrete Component) 역할: 추가 책임을 받을 클래스를 정의합니다.
  • 장식(Decorator) 역할: Component 대상을 가리키는 바늘을 가지고 Component 인터페이스와 일치하는 인터페이스를 정의합니다.
  • 구체적인 장식(Concrete Decorator) 역할: 구성 요소의 대상에게 추가 책임을 부여한다.

  • 적용성
  • 다른 객체에 영향을 주지 않고 동적이고 투명하게 개별 객체에 책임을 추가합니다.
  • 취소할 수 있는 직책을 처리한다. 즉, 한 대상에 동적으로 기능을 추가해야 하고 이런 기능은 동적으로 취소할 수 있다.
  • 채색으로 자류를 생성할 수 없는 방법을 확충할 때.한 가지 상황은 대량의 독립적인 확장이 있을 수 있고 모든 조합을 지원하기 위해 대량의 자류가 발생하여 자류의 수가 폭발적으로 증가할 수 있다는 것이다.다른 상황은 클래스 정의가 숨겨져 있거나, 클래스 정의가 하위 클래스를 생성하는 데 사용할 수 없기 때문일 수도 있습니다.
  • 기본 클래스 인터페이스 Component
  • 원시 클래스 인터페이스의 구체적인 구현 클래스Concrete Component
  • 장식기 인터페이스 Decorator
  • 장식기 인터페이스의 구체적인 구현 Concrete Decorator
  • 예제 2
    // 
    abstract class Beverage()
    {
        private $description = 'Unknown Beverage';
    
        public function getDescription()
        {
            return $description;
        }
    
        abstract public function double cost();
    }
    
    // 1
    class Espresso extends Beverage
    {
        public function __construction()
        {
            $this->description = "Espresso";
        }
    
        public function cost()
        {
            return 1.99;
        }
    }
    
    // 2
    class HouseBlend extends Beverage
    {
        public function __construction()
        {
            $this->description = "HouseBlend";
        }
    
        public function cost()
        {
            return 0.89;
        }
    }
    
    // 
    abstract class CondimentDecorator extends Beverage
    {
        protected $beverage;
    
        public function __construct(Beverage $beverage)
        {
            $this->beverage = $beverage;
        }
    
        abstract public function getDescription();
    }
    
    // 1
    class Mocha extends CondimentDecorator
    {
        public function getDescription()
        {
            return $this->beverage->getDescription.", Mocha";
        }
    
        public function cost()
        {
            return .20 + $this->beverage->cost();
        }
    }
    

    테스트
    $expressoWithMocha = new Mocha(new Espresso());
    $expressoWithMocha->getDescription();
    $expressoWithMocha->cost();
    

    좋은 웹페이지 즐겨찾기