루비 가 디자인 모드 의 장식 기 모드 를 사용 하 는 방법 을 실례 로 설명 하 다
만약 에 대상 을 대상 으로 하 는 개발 에 종사 한 적 이 있다 면 유형 이나 대상 에 게 행 위 를 증가 시 키 고 계승 체 제 를 사용 하 는 것 은 모든 대상 을 대상 으로 하 는 언어 중 하나 이다. 기본 특성만약 에 이미 존재 하 는 한 가지 방법 이 부족 하거나 방법 에 더 많은 기능(매력)을 추가 해 야 한다 면 이런 유형 만 계승 하여 새로운 유형 을 만 들 수 있 습 니 다.이것 은 추가 코드 에 세 워 질 수 있 습 니 다.
기 존 종 류 를 계승 함으로써 자 류 는 자신의 방법 을 가 지 는 동시에 부 류 를 가 지 는 방법 을 가 질 수 있다.그러나 이런 방법 은 정적 이 므 로 사용 자 는 행동 을 증가 하 는 방식 과 시 기 를 통제 할 수 없다.하면,만약,만약... 당신 은 이미 초기 화 된 대상 의 행동 을 바 꾸 기 를 원 합 니 다.당신 은 어떻게 하 시 겠 습 니까?아니면,당신 은 여러 가지 행 위 를 계승 하고 싶 습 니 다.어떻게 하 시 겠 습 니까?앞의 하 나 는 운행 할 때 만 완성 할 수 있 고 후 자 는 분명히 가능 하지만 대량의 다른 유형의 무 서운 일이 발생 할 수 있다.
문제.
당신 은 어떻게 코드 를 조직 하여 기본 적 이거 나 거의 사용 되 지 않 는 특성 을 쉽게 추가 할 수 있 습 니까?
해결 방안
아래 의 경우 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")
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Ruby의 단일 메소드 및 단일 클래스 상세 정보단일 방법 Ruby는 단일 객체에만 적용되는 단일 객체 추가 방법을 단일 방법이라고 합니다. 또한 위에서 사용한 정의 방법 외에 Object#define_를 통해singleton_method 방법으로 단일 방법 정의...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.