Ruby on Rails 패턴-데코레이터 대 발표자


112

최근 Ruby on Rails 커뮤니티에는 데코레이터 와 발표자 에 대한 모든 종류의 이야기 가 있습니다.

둘의 근본적인 차이점은 무엇입니까? 만약 있다면, 어떤 것을 다른 것보다 사용할 것인지 알려주는 단서는 무엇입니까? 아니면 두 가지를 함께 사용 하시겠습니까?

답변:


102

데코레이터는 "이 엔티티에 일부 기능을 추가하자"에 가깝습니다. 발표자는 "모델 / 백엔드와보기 사이에 다리를 놓자"에 가깝습니다. 발표자 패턴에는 여러 가지 해석이 있습니다.

데코레이터는 일반 / 일반적인 용도입니다. 발표자는 책임 / 사용 범위가 좁습니다. 데코레이터는 도메인 전체에서 사용되며 발표자는 거의 항상보기와 유사한 기능과 관련이 있습니다.


3
감사. Draper gem은 발표자와 데코레이터의 하이브리드 인 것 같습니다.
keruilin

17
@keruilin 한 가지 명심해야 할 점 : 데코레이터는 상속의 한계를 극복하는 것이 목적 중 하나이기 때문에 다른 데코레이터를 실제로 데코레이터 (컴포넌트 객체 데코레이션도 포함) 할 수 있어야합니다. (Draper는 이것을 하지 않습니다 ). 데코레이터 패턴은 인사이드 아웃 대신 아웃 사이드 인에서 처리된다는 점을 제외하고는 그 의미에서 복합 패턴과 매우 유사합니다.
얼룩

7
데코레이터는 범용 패턴으로, 발표자는 뷰 레이어와 관련된 데코레이터의 특정 애플리케이션으로 간주합니다.
Kris

2
@Smudge, draper 데코레이터는 적어도 기본 모델에 STI 관계가있는 것처럼 다른 데코레이션을 장식 할 수 있습니다.
keruilin 2012 년

이제 Draper는 자신을 프레젠테이션 레이어 래퍼로 식별하는 것 같습니다. 따라서 더 이상 데코레이터가 아니라 실제로 발표자입니다. GH에서 : "Draper는 Rails 애플리케이션에 객체 지향 프레젠테이션 로직 레이어를 추가합니다."
Jared

35

나는 이것을 확인하는 것이 좋습니다- 전시 대 발표자 .

데코레이터는 특정 개체의 다른 인스턴스에 영향을주지 않고 특정 개체를 래핑하여 기능을 확장하는 데 사용되는 디자인 패턴입니다. 일반적으로 데코레이터 패턴은 열기 / 닫기 원칙 (클래스는 수정을 위해 닫히지 만 확장에 사용할 수 있음).

전시 및 발표자 패턴은 모두 일종의 데코레이터 패턴입니다.


Mike Pack의 블로그 게시물 링크에 +1. 패턴 간의 차이점을 설명하는 우수한 게시물입니다.
ki4jnq

전시 패턴을 언급하면 ​​+1. 나는 그것을 설명하는 Avdi Grimm의 책을 얻었습니다. 내 문제에 대한 올바른 해결책은 아니었지만 여전히 놀라운 패턴입니다. 생각하기에 훌륭한 음식.
Yonk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.