루비 가 디자인 모드 의 장식 기 모드 를 사용 하 는 방법 을 실례 로 설명 하 다

6950 단어 Ruby디자인 모드
개술
       만약 에 대상 을 대상 으로 하 는 개발 에 종사 한 적 이 있다 면 유형 이나 대상 에 게 행 위 를 증가 시 키 고 계승 체 제 를 사용 하 는 것 은 모든 대상 을 대상 으로 하 는 언어 중 하나 이다.  기본 특성만약 에 이미 존재 하 는 한 가지 방법 이 부족 하거나 방법 에 더 많은 기능(매력)을 추가 해 야 한다 면 이런 유형 만 계승 하여 새로운 유형 을 만 들 수 있 습 니 다.이것 은 추가 코드 에 세 워 질 수 있 습 니 다.
      기 존 종 류 를 계승 함으로써 자 류 는 자신의 방법 을 가 지 는 동시에 부 류 를 가 지 는 방법 을 가 질 수 있다.그러나 이런 방법 은 정적 이 므 로 사용 자 는 행동 을 증가 하 는 방식 과 시 기 를 통제 할 수 없다.하면,만약,만약...  당신 은 이미 초기 화 된 대상 의 행동 을 바 꾸 기 를 원 합 니 다.당신 은 어떻게 하 시 겠 습 니까?아니면,당신 은 여러 가지 행 위 를 계승 하고 싶 습 니 다.어떻게 하 시 겠 습 니까?앞의 하 나 는 운행 할 때 만 완성 할 수 있 고 후 자 는 분명히 가능 하지만 대량의 다른 유형의 무 서운 일이 발생 할 수 있다.
문제.
      당신 은 어떻게 코드 를 조직 하여 기본 적 이거 나 거의 사용 되 지 않 는 특성 을 쉽게 추가 할 수 있 습 니까?
해결 방안
  •        대상 에 게 추가 적 인 직책 이나 행 위 를 동적 으로 추가 하 다.기능 을 증가 시 키 는 데 있어 서 Decorator 모델 은 하위 클래스 를 생 성 하 는 것 보다 더욱 유연 하 다
  •        하위 클래스 를 바 꾸 는 유연 한 방안 을 제공 했다.장식 기 모드 는 원본 파일 을 바 꾸 거나 계승 을 사용 하지 않 아 도 되 는 상황 에서 대상 을 동적 으로 확장 하 는 기능 입 니 다.그것 은 포장 대상,즉 장식 을 통 해 진실 한 대상 을 감 싸 는 것 이다
  •        하위 클래스 에 사용 할 때 장식 기 모드 가 더욱 유용 합 니 다.만약 에 일족 하위 클래스(하나의 부모 클래스 에서 파생 된 것)를 가지 고 있다 면 하위 클래스 와 독립 적 으로 사용 하 는 상황 에서 추가 적 인 특성 을 추가 해 야 합 니 다.코드 중복 과 구체 적 인 하위 클래스 의 수량 이 증가 하지 않도록 장식 기 모드 를 사용 할 수 있 습 니 다
  •  적용 성
           아래 의 경우 Decorator 모드 를 사용 합 니 다.
  •       다른 대상 에 게 영향 을 주지 않 는 상황 에서 동태 적 이 고 투명 한 방식 으로 한 대상 에 게 직책 을 추가 합 니 다
  •       취소 할 수 있 는 직책 을 처리 하 다
  •       하위 클래스 를 만 드 는 방법 으로 확장 할 수 없 을 때.한 가지 상황 은 대량의 독립 적 인 확장 이 있 을 수 있다 는 것 이다
  •       모든 조합 을 지원 하기 위해 대량의 하위 클래스 가 발생 하여 하위 클래스 의 수가 폭발 적 으로 증가 할 것 이다.
          다른 상황 은 클래스 정의 가 숨겨 져 있 거나 클래스 정의 가 하위 클래스 를 만 드 는 데 사용 되 지 않 기 때 문 일 수 있 습 니 다.
     
    실례
    
    class SimpleWriter 
     def initialize(path) 
      @file = File.open(path,"w") 
     end 
      
     def write_line(line) 
      @file.print(line) 
      @file.print("
    ") end # def pos @file.pos end # def rewind @file.rewind end def close @file.colse end end sw = SimpleWriter.new("test.txt") sw.write_line(" ") puts sw.pos puts sw.rewind # class WriterDecorator def initialize(real_writer) @real_writer = real_writer end def write_line @real_writer.write_line end def pos @real_writer.pos end def rewind @real_writer.rewind end def close @real_writer.close end end class NumberingWriter < WriterDecorator attr :line_number def initialize(real_writer) super(real_writer) @line_number = 1 end # WriterDecorator write_line , ( ) # NumberingWriter WriterDecorator wirte_line # def write_line(line) @real_writer.write_line("#{@line_number}:#{line}") @line_number += 1 end end sw = SimpleWriter.new("numbering_write.txt") nw = NumberingWriter.new(sw) nw.write_line("hello,world") nw.write_line("hello,ruby") puts nw.line_number class CheckSummingWriter < WriterDecorator attr_reader :check_num def initialize(real_writer) super(real_writer) @check_num = 0 end def write_line(line) line.each_byte{|byte| @check_num += byte % 256} @real_writer.write_line(line) end end sw = SimpleWriter.new("check_num_writer.txt") csw = CheckSummingWriter.new(sw) csw.write_line("hello,world") puts csw.check_num class TimeStampingWriter < WriterDecorator def initialize(real_writer) super(real_writer) end def write_line(line) @real_writer.write_line("#{Time.now}: #{line}") end end # #5. SimpleWriter write_line , sw = SimpleWriter.new("mix.txt") #4. NumberingWriter write_line , # @real_writer, @real_witer sw nw = NumberingWriter.new(sw) #3. TimeStampingWriter write_line , # @real_writer, @real_witer nw tsw = TimeStampingWriter.new(nw) #2. CheckSummingWriter write_line , # @real_writer, @real_witer tsw csw = CheckSummingWriter.new(tsw) #1. csw write_line csw.write_line("hello,world") puts csw.check_num
    두 가지 ruby 스타일 의 장식 모델 응용
     
    (1)extend 혼합 모듈 사용
    
    class SimpleWriter 
     def initialize(path) 
      @file = File.open(path,"w") 
     end 
     
     def write_line(line) 
      @file.print(line) 
      @file.print("
    ") end # def pos @file.pos end # def rewind @file.rewind end def close @file.colse end end # extend , module TimeStampingWriter def write_line(line) super("#{Time.now}:#{line}") end end module NumberingWriter attr_reader :line_number def write_line(line) @line_number = 1 unless @line_number super("#{@line_number}:#{line}") @line_number += 1 end end
     
    마지막 으로 추 가 된 모듈 은 먼저 호출 되 고 슈퍼 를 통 해 부모 클래스 의 write 를 호출 합 니 다.라인 방법. 
    예 를 들 어 먼저 텍스트 앞 에 시간 스탬프 를 붙 이 고 번 호 를 추가 한 다음 에 파일 을 쓴다.  
    
    sw = SimpleWriter.new("out3.txt") 
    sw.extend(NumberingWriter) 
    sw.extend(TimeStampingWriter) 
    sw.write_line("hello,ruby") 
    
     
    (2)alias 키 워드 를 사용 합 니 다.
    
    class SimpleWriter 
     def initialize(path) 
      @file = File.open(path,"w") 
     end 
     
     def write_line(line) 
      @file.print(line) 
      @file.print("
    ") end # def pos @file.pos end # def rewind @file.rewind end def close @file.colse end end ruby : , out1.txt , sw2,out2.txt 。 sw1 = SimpleWriter.new("out1.txt") class << sw1 alias old_write_line write_line def write_line(line) old_write_line("#{Time.now}:#{line}") end end sw1.write_line("hello,world") sw2 = SimpleWriter.new("out2.txt") sw2.write_line("hello,world")

    좋은 웹페이지 즐겨찾기