데코레이터 디자인 패턴에서 데코레이터가 필요한 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/273943

  •  07-07-2019
  •  | 
  •  

문제

내가 이름이 지정된 수업이 있다고 가정합니다 A, 그리고 데코레이터 디자인 패턴을 사용하고 싶습니다. 내가 틀렸다면 나를 교정하지만, 그것이 효과가 있으려면 데코레이터 클래스를 만들어야합니다. ADecorator, 이는 An에 대한 언급을 보유 할 것입니다 A 예를 들어, 다른 모든 데코레이터는 기능을 추가하기 위해 이것을 확장합니다.

나는 왜 우리가 사용하는 대신 데코레이터 클래스를 만들어야하는지 이해하지 못합니다. A 사례?

도움이 되었습니까?

해결책

데코레이터 패턴은 동적으로 개체에 기능을 추가하는 데 사용됩니다 (즉, 런타임에). 일반적으로 객체는 클래스를 작성할 때 기능을 고정합니다. 그러나 중요한 점은 객체의 기능이 객체의 클라이언트에 투명한 방식으로 확장된다는 것입니다. 원래 객체가 장식 된 객체에 대한 책임을 위임하는 것과 동일한 인터페이스를 구현하기 때문입니다.

데코레이터 패턴은 객체가 가질 수있는 많은 선택적 기능이있는 시나리오에서 작동합니다. 데코레이터 패턴이 없으면 각 객체 옵션 구성마다 다른 클래스를 만들어야합니다. 꽤 유용한 예제는 다음과 같습니다 첫 번째 디자인 패턴을 헤드하십시오 O'Reilly의 예약. 스타 벅스처럼 들리는 커피 숍 예제를 사용합니다.

따라서 비용과 같은 방법이있는 기본 커피가 있습니다.

public double cost(){
     return 3.45;
}

그런 다음 고객은 0.35의 크림을 추가 할 수 있으므로 이제 비용 방법으로 커피 크림 클래스를 만듭니다.

public double cost(){
    return 3.80;
}

그런 다음 고객은 0.5의 비용이 드는 모카를 원할 수 있으며 크림이없는 크림 또는 모카가있는 모카를 원할 수도 있습니다. 그래서 당신은 coffeemochacream과 coffeemocha 수업을 만듭니다. 그런 다음 고객은 더블 크림을 원하므로 CoffeecReamcream 등급을 만듭니다. 등급 등은 클래스 폭발입니다. 사용 된 가난한 사례를 실례합니다. 조금 늦었고 나는 그것이 사소하다는 것을 알고 있지만 요점을 표현합니다.

대신 추상 비용 방법으로 항목 추상 클래스를 만들 수 있습니다.

public abstract class Item{
    public abstract double cost();
}

항목을 확장하는 콘크리트 커피 클래스를 만들 수 있습니다.

public class Coffee extends Item{
    public double cost(){
       return 3.45;
    }
}

그런 다음 동일한 인터페이스를 확장하고 항목을 포함하는 CofeEdeCorator를 만듭니다.

public abstract class CoffeeDecorator extends Item{
     private Item item;
     ...
}

그런 다음 각 옵션마다 콘크리트 데코레이터를 만들 수 있습니다.

public class Mocha extends CoffeeDecorator{

   public double cost(){
     return item.cost() + 0.5;
   }

}

데코레이터가 아이템 인 한 어떤 유형의 물체를 감싸지 않는지 주목하십시오. 항목 객체의 비용 ()을 사용하고 간단히 자체 비용을 추가합니다.

public class Cream extends CoffeeDecorator{

   public double cost(){
     return item.cost() + 0.35;
   }

}

이제 몇 가지 클래스로 많은 수의 구성이 가능합니다.

 Item drink = new Cream(new Mocha(new Coffee))); //Mocha with cream

또는

 Item drink = new Cream(new Mocha(new Cream(new Coffee))));//Mocha with double cream

등등.

다른 팁

나는 그것을 더 잘 설명 할 수 없다 위키 백과 기사.

BTW, 패턴을 시작한 경우 Head First Design Patterns Book은 다음과 같습니다. 경이로운. 그것은 실제로 개념을 소화하기에 간단하게 만들고, 이해하기 쉬운 방식으로 비슷한 패턴을 대조하고 비교할 수 있습니다.

일부 언어 (Ruby 또는 JavaScript)에서는 인스턴스에 새로운 기능을 추가 할 수 있습니다. 귀하의 질문에 Java가 태그가 지정되어 있으므로 Java 에서이 작업을 수행 할 수없는 이유를 묻고 있다고 가정합니다. 그 이유는 Java가 정적으로 입력되기 때문입니다. 인스턴스는 클래스 A가 정의하거나 상속하는 메소드 만 가질 수 있습니다. 따라서 실행 시간에 A를 정의하지 않는 인스턴스를 제공하려면이 새로운 메소드가 다른 클래스에서 정의되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top