프록시 패턴

5925 단어 디자인 패턴Scala
Proxy 패턴은, 어느 오브젝트와 같이 행동하는 대리 클래스를 준비한다, 라고 하는 실장 테크닉이다.
대리 클래스를 준비하는 테크닉은 여러 곳에서 사용된다. 예를 들어,
  • String 대신에 HTMLString, RawString 등의 클래스를 준비한다.
  • 사용자가 입력한 문자열을 직접 표시하여 XSS 공격을 방지

  • Image 대신에 LazyImage 클래스를 준비해, 실제로 이미지가 필요할 때까지 로딩을 늦춘다
  • 실제 객체 대신 Mock 객체를 사용합니다.
  • 실제 객체 대신 참조 및 참조 카운터가있는 객체를 사용합니다.
  • 로드하는데 시간이 걸리는 데이터를 기다리지 않고 Future 객체를 돌려준다
  • 대리인을 준비한다는 점에서 프록시 패턴의 변종이지만 클래스 다이어그램과 동작이 다르므로 같은 패턴이라고 말할 수 있는지는 미묘합니다.


  • 클래스 다이어그램





    구현 예



    String 대신에 HTMLString, RawString 등의 클래스를 준비한다


    trait SmartString {
      def get: String
    }
    
    class RawString(val original: String) extends SmartString {
      def get: String = original
    }
    
    class HtmlString[T <: SmartString](val original: T) extends SmartString {
      lazy val escapedString = original.get
        .replaceAll("<", "&lt;")
        .replaceAll(">", "&gt;")
    
      def get: String = escapedString
    }
    
    // 引数に HtmlString を指定することで、Escape されていない RawString が表示されるのを防ぐ
    def showText[T <: SmartString](text: HtmlString[T]): Unit = {
      println(text.get)
    }
    
    val x = new RawString("<script>alert(\"this is raw string\");</script>")
    val y = new HtmlString(x)
    
    // showText(x)  // コンパイルエラー
    showText(y)     // &lt;script&gt;alert(\"this is raw string\");&lt;/script&gt;
    

    구현 in real world


  • shared_ptr
  • 직접 객체 생성/삭제를 관리하는 대신 참조 카운트를 보유하는 객체를 생성하고 관리합니다.
  • 참조 htps : //이자 cp. rg / uki / fuq / cp p11-b b ry # 멋쟁이 dptr
  • 라이브러리 htps : // 기주 b. 이 m/gc-무로 r/gc/bぉb/마s r/ぃbstdc%2B%2Bv3/인cぅ로/비 ts/샤레 d_ptr. h#L103

  • 이미지 지연 로딩
  • 실제로 이미지가 필요할 때까지 로딩을 지연시킵니다
  • htps : // 기주 b. 이 m/쓰우포/j쿠에 ry_ぁzyぉ아 d/bぉb/마s r/j쿠에 ry.ぁ zy 아 d. js#L99


  • 다른 패턴과의 관계


  • Adaptor 패턴
  • Adapter 패턴은 기존 클래스를 변경하지 않고 인터페이스를 변경하는 기술입니다.
  • 같은 기능을 가지는 복수의 타사 라이브러리를, 사용자의 취향으로 전환해 사용할 수 있도록(듯이) 하고 싶지만, 인터페이스가 각사 엉망으로, 타사제이므로 인터페이스를 괴롭히지 않는다.
  • 그럴 때 사용할 수있는 디자인 패턴

  • 타사 라이브러리의 "대신"사용이라는 점에서 Proxy 패턴과 비슷하지만, 진짜 클래스와 프록시 클래스의 인터페이스는 공통적이지 않다는 점에서 다르다. 목적도 다르므로 잘못된 것은 적을 것입니다

  • Decorator 패턴
  • Decorator 패턴은 기존 클래스를 변경하지 않고 새로운 기능을 추가하는 기술입니다.
  • 데코레이트 된 오브젝트를, 실제의 오브젝트의 「대신에」사용한다고 하는 점에서, Proxy 패턴과 매우 비슷하다.
  • 목적이 다르다
  • Decorator 패턴은 기능 추가에 주목을 받고 있습니다
  • 프록시 패턴은 실제 객체가 어떤 이유 (예 : 부하 또는 아직 존재하지 않음)로 사용할 수없는 경우 대체합니다.


  • 좋은 웹페이지 즐겨찾기