2010-04-06 4 views

답변

9

mixin은 클래스에 동작을 추가 할 때 적합합니다. 예 : 컬렉션 유형의 경우 열거 할 수있는 기능. 원하는만큼 많은 행동 집합을 수업에 믹스 할 수 있습니다. 공통 코드를 재사용 할 수있는 좋은 방법입니다. 당신은 기본적으로 무료로 많은 방법을 얻습니다.

반면에 장식자는 더 이상 비열한 요격기입니다. 이것은 대상 객체와 동일한 공용 인터페이스를 노출하고 모든 클라이언트 호출을 위임하는 대상 객체를 포함합니다. 그러나 그것은 사전 및/또는 사후 처리로 전화를 장식합니다. 예 : MyCollection에 대한 코드를 작성하고이 유형의 모든 호출을 기록하려고합니다. 새로운 장식 자 MyCollectionWithTimeStampedLogging이 ICollection 기반에서 파생되어 클라이언트와 동일하게 보일 수 있습니다. 데코레이터는 ICollection의 인스턴스를 매개 변수로 사용하고 호출을 위임합니다. 예 : 추가 모양은 다음과 같습니다.

public void Add(int item) 
{ 
    _logger.log(String.Format("{0} Add called with param {1}", DateTime.Now, item.ToString()); 
    _collection.Add(item); 
    _logger.log(String.Format("{0} Add completed with param {1}", DateTime.Now, item.ToString()); 
} 
+0

Decorator는 Aspect Oriented Programming (AOP)과 약간 비슷합니다. 믹스 인이 기존 클래스를 수정하기 만합니까? – leeand00

+0

@ leeand00 - 종류의; AOP는 제가 생각하기에 장식가 이상의 것 이상입니다. 믹스 인은 동적 언어에서 더 널리 퍼져 있으며, 믹스 인을 사용하면 클래스 정의에 여러 가지 방법을 혼합 할 수 있습니다. 예 : Module Persistable에서로드 및 저장 구현 (클래스에 반영하고 디스크에 공개 속성 읽기/쓰기)을 작성한 다음이를 여러 클래스로 혼합 할 수 있습니다. 이제이 모든 클래스를 디스크에 유지할 수 있습니다. – Gishu

+0

AOP (나는 mixins에 대해 더 잘 알고있다.)를 사용하면 선택한 인터페이스에서 발생할 수있는 3 가지 다른 것들을 지정할 수있다. 사전 행동, 사후 행동 및 대신 행동을 지정할 수있다. 동작. – leeand00

2

Decorator가 런타임에 확장한다는 진술에 동의하지 않습니다. 위키 피 디아 (Wikipedia)가 말한 것입니다. 그러나 그것이 정확하다고는 생각하지 않습니다. GoF의 Decorator 패턴 정의를 읽는 것이 좋습니다. 그것은 동적 인 확장입니다, 그렇습니다.하지만 반드시 런타임에있을 필요는 없습니다.

+2

꼭 그래야 할 필요는 없습니다. – leeand00

12

데코레이터 패턴을 사용하는 경우 일반적으로 기본 클래스를 확장 (또는 혼합)하지 않고 캡슐화합니다. 클래스의 기능을 사용하기를 원하지만 호출을 랩핑하기를 원하기 때문에 호출 전후에 몇 가지 추가 단계를 수행 할 수 있기 때문에이 작업을 자주 수행합니다. 당신은 실제로 대리자를 노출하고 싶지 않은 LoggerDecorator

public class LoggerDecorator implements SomeInterface { 
     private SomeInterface delegate; 
     public void someMethod() { 
      LOGGER.debug("someMethod called"); 
      delegate.someMethod(); 
     } 
} 

을 고려하지만 당신은 그 기능을 사용하고 싶습니다. 그래서 당신이 우리 mixins 여부, 클래스를 확장하거나 장식 정말 당신이 무엇을하려고하는지에 따라 달라집니다. 수업을 연장하고 그것에 새로운 기능을 추가하고 있습니까? 아니면 클래스를 꾸미거나 장식하고 있습니까?

+0

@Jeff 내가 Gishu의 게시물에서 아래에 댓글을 달았고, 내가 가지고 있는지 아닌지 말해줘. – leeand00

+0

당신이 올바른 방향으로 가고 있다고 생각하지만, AOP는 동적 인 인터셉터 프레임 워크입니다. 이것은 런타임에 (또는 aspectj로 컴파일하면 컴파일 할 때) 발생합니다. 일반적으로 AOP가 필요하다면 데코레이터 경로를 사용하는 것이 좋습니다.주의하지 않으면 런타임 주입이 더 취약해질 수 있기 때문입니다. –

관련 문제