Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby의 데코레이터 디자인 패턴

데코레이터 디자인 패턴이란 무엇입니까?

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 수업.

Ruby의 데코레이터 디자인 패턴

WithLogging을 가질 수 없습니다. 및 WithPerformanceTesting 동시에 이 클래스를 생성하지 않는 한...

class HTTPClientWithLoggingAndPerformanceTesting
  # ...
end

데코레이터 패턴이 해결됩니다. 이 문제는 코드 중복을 방지하는 동안 &미친 클래스 이름.

동영상

요약

데코레이터 디자인 패턴에 대해 배웠습니다. , 이 패턴은 객체에 새로운 기능을 추가하는 데 도움이 됩니다. 클래스를 변경할 필요 없이.

수동적이지 마십시오! 이제 이 개념을 직접 연습하고 적용할 차례입니다. 필요할 때 이것을 기억하는 데 도움이 될 것입니다.

더 많은 사람들이 읽을 수 있도록 이 기사를 공유하세요 🙂