데코레이터 패턴은 클래스의 동적 확장시 런타임입니다. 그것은 동적으로 is-a 관계를 형성합니다.mixin과 데코레이터 패턴의 차이점은 무엇입니까?
mixin과 추상 클래스의 차이점에 대해 this answer을 얻은 후에 데코레이터 패턴을 사용하여 API를 과도하게 복잡하게 만드는지 궁금해하기 시작했습니다.
데코레이터 패턴은 클래스의 동적 확장시 런타임입니다. 그것은 동적으로 is-a 관계를 형성합니다.mixin과 데코레이터 패턴의 차이점은 무엇입니까?
mixin과 추상 클래스의 차이점에 대해 this answer을 얻은 후에 데코레이터 패턴을 사용하여 API를 과도하게 복잡하게 만드는지 궁금해하기 시작했습니다.
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());
}
Decorator가 런타임에 확장한다는 진술에 동의하지 않습니다. 위키 피 디아 (Wikipedia)가 말한 것입니다. 그러나 그것이 정확하다고는 생각하지 않습니다. GoF의 Decorator 패턴 정의를 읽는 것이 좋습니다. 그것은 동적 인 확장입니다, 그렇습니다.하지만 반드시 런타임에있을 필요는 없습니다.
꼭 그래야 할 필요는 없습니다. – leeand00
데코레이터 패턴을 사용하는 경우 일반적으로 기본 클래스를 확장 (또는 혼합)하지 않고 캡슐화합니다. 클래스의 기능을 사용하기를 원하지만 호출을 랩핑하기를 원하기 때문에 호출 전후에 몇 가지 추가 단계를 수행 할 수 있기 때문에이 작업을 자주 수행합니다. 당신은 실제로 대리자를 노출하고 싶지 않은 LoggerDecorator
public class LoggerDecorator implements SomeInterface {
private SomeInterface delegate;
public void someMethod() {
LOGGER.debug("someMethod called");
delegate.someMethod();
}
}
을 고려하지만 당신은 그 기능을 사용하고 싶습니다. 그래서 당신이 우리 mixins 여부, 클래스를 확장하거나 장식 정말 당신이 무엇을하려고하는지에 따라 달라집니다. 수업을 연장하고 그것에 새로운 기능을 추가하고 있습니까? 아니면 클래스를 꾸미거나 장식하고 있습니까?
@Jeff 내가 Gishu의 게시물에서 아래에 댓글을 달았고, 내가 가지고 있는지 아닌지 말해줘. – leeand00
당신이 올바른 방향으로 가고 있다고 생각하지만, AOP는 동적 인 인터셉터 프레임 워크입니다. 이것은 런타임에 (또는 aspectj로 컴파일하면 컴파일 할 때) 발생합니다. 일반적으로 AOP가 필요하다면 데코레이터 경로를 사용하는 것이 좋습니다.주의하지 않으면 런타임 주입이 더 취약해질 수 있기 때문입니다. –
Decorator는 Aspect Oriented Programming (AOP)과 약간 비슷합니다. 믹스 인이 기존 클래스를 수정하기 만합니까? – leeand00
@ leeand00 - 종류의; AOP는 제가 생각하기에 장식가 이상의 것 이상입니다. 믹스 인은 동적 언어에서 더 널리 퍼져 있으며, 믹스 인을 사용하면 클래스 정의에 여러 가지 방법을 혼합 할 수 있습니다. 예 : Module Persistable에서로드 및 저장 구현 (클래스에 반영하고 디스크에 공개 속성 읽기/쓰기)을 작성한 다음이를 여러 클래스로 혼합 할 수 있습니다. 이제이 모든 클래스를 디스크에 유지할 수 있습니다. – Gishu
AOP (나는 mixins에 대해 더 잘 알고있다.)를 사용하면 선택한 인터페이스에서 발생할 수있는 3 가지 다른 것들을 지정할 수있다. 사전 행동, 사후 행동 및 대신 행동을 지정할 수있다. 동작. – leeand00