데코레이터 디자인 패턴이란 무엇입니까?
Ruby 프로젝트에서 이 패턴을 어떻게 사용할 수 있습니까?
데코레이터 디자인 패턴은 새로운 기능을 추가하여 개체를 향상시키는 데 도움이 됩니다. 클래스를 변경하지 않고도 사용할 수 있습니다.
예를 살펴보겠습니다!
로깅 및 성능
이 예에서는 rest-client와 같은 gem을 사용하여 HTTP 요청을 만들고 있습니다.
다음과 같습니다.
require 'restclient' data = RestClient.get("www.rubyguides.com")
지금 :
일부 요청에 로깅을 추가하고 RestClient
를 변경하고 싶지 않다고 가정해 보겠습니다. 모듈.
데코레이터 패턴을 사용하여 이 작업을 수행할 수 있습니다.
로깅 모듈은 다음과 같습니다. :
module LogHTTPRequest def get(url) puts "Sending Request For #{url}" super end end
그러면 화면에 원하는 정보가 인쇄되고 원래 get
RestClient
의 메소드 .
요청에 로깅 기능을 추가하려면 extend
를 사용할 수 있습니다. 방법.
좋아요 :
class HTTPClient def initialize(client = RestClient) @client = client end def get(*args) @client.get(*args) end end client = HTTPClient.new client.extend(LogHTTPRequest) client.get("rubyguides.com")
이 HTTPClient
를 생성해야 합니다. RestClient
때문에 래퍼 클래스 은 모듈이며 모듈에서 개체를 만들 수 없습니다.
데코레이터 패턴을 사용하는 경우
이 패턴의 장점은 하나의 개체만 강화한다는 것입니다. , 그래서 당신은 비로깅 클라이언트와 로깅 클라이언트를 가질 수 있습니다.
또 다른 이점은 이러한 데코레이터를 계층화하고 성능 테스트를 수행하는 데코레이터, 로깅을 위한 데코레이터 등을 둘 수 있다는 것입니다.
상속을 사용하여 HTTPClientWithLogging
을 만든 경우 데코레이터를 결합하는 것이 불가능합니다. 및 HTTPClientWithPerformanceTesting
수업.
WithLogging
을 가질 수 없습니다. 및 WithPerformanceTesting
동시에 이 클래스를 생성하지 않는 한...
class HTTPClientWithLoggingAndPerformanceTesting # ... end
데코레이터 패턴이 해결됩니다. 이 문제는 코드 중복을 방지하는 동안 &미친 클래스 이름.
동영상
요약
데코레이터 디자인 패턴에 대해 배웠습니다. , 이 패턴은 객체에 새로운 기능을 추가하는 데 도움이 됩니다. 클래스를 변경할 필요 없이.
수동적이지 마십시오! 이제 이 개념을 직접 연습하고 적용할 차례입니다. 필요할 때 이것을 기억하는 데 도움이 될 것입니다.
더 많은 사람들이 읽을 수 있도록 이 기사를 공유하세요 🙂