最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

實(shí)例講解Ruby使用設(shè)計模式中的裝飾器模式的方法

 更新時間:2016年03月16日 15:28:25   作者:michael_roshen  
這篇文章主要介紹了Ruby使用設(shè)計模式中的裝飾器模式的實(shí)例, 裝飾模式能夠?qū)崿F(xiàn)動態(tài)的為對象添加功能,需要的朋友可以參考下

概述
       若你從事過面向?qū)ο箝_發(fā),實(shí)現(xiàn)給一個類或?qū)ο笤黾有袨?,使用繼承機(jī)制,這是所有面向?qū)ο笳Z言的一  個基本特性。如果已經(jīng)存在的一個類缺少某些方法,或者須要給方法添加更多的功能(魅力),你也許會僅僅繼承這個類來產(chǎn)生一個新類—這建立在額外的代碼上。
      通過繼承一個現(xiàn)有類可以使得子類在擁有自身方法的同時還擁有父類的方法。但是這種方法是靜態(tài)的,用戶不能控制增加行為的方式和時機(jī)。如果  你希望改變一個已經(jīng)初始化的對象的行為,你怎么辦?或者,你希望繼承許多類的行為,改怎么辦?前一個,只能在于運(yùn)行時完成,后者顯然時可能的,但是可能會導(dǎo)致產(chǎn)生大量的不同的類—可怕的事情。
問題
      你如何組織你的代碼使其可以容易的添加基本的或者一些很少用到的 特性,而不是直接不額外的代碼寫在你的類的內(nèi)部?

解決方案

  •        動態(tài)地給一個對象添加一些額外的職責(zé)或者行為。就增加功能來說, Decorator模式相比生成子類更為靈活。
  •        提供了改變子類的靈活方案。裝飾器模式在不必改變原類文件和使用繼承的情況下,動態(tài)的擴(kuò)展一個對象的功能。它是通過創(chuàng)建一個包裝對象,也就是裝飾來包裹真實(shí)的對象。
  •        當(dāng)用于一組子類時,裝飾器模式更加有用。如果你擁有一族子類(從一個父類派生而來),你需要在與子類獨(dú)立使用情況下添加額外的特性,你可以使用裝飾器模式,以避免代碼重復(fù)和具體子類數(shù)量的增加。

 適用性

       以下情況使用Decorator模式

  •       在不影響其他對象的情況下,以動態(tài)、透明的方式給單個對象添加職責(zé)。
  •       處理那些可以撤消的職責(zé)。
  •       當(dāng)不能采用生成子類的方法進(jìn)行擴(kuò)充時。一種情況是,可能有大量獨(dú)立的擴(kuò)展,

      為支持每一種組合將產(chǎn)生大量的子類,使得子類數(shù)目呈爆炸性增長。

      另一種情況可能是因?yàn)轭惗x被隱藏,或類定義不能用于生成子類。
 
實(shí)例

class SimpleWriter 
 def initialize(path) 
  @file = File.open(path,"w") 
 end 
  
 def write_line(line) 
  @file.print(line) 
  @file.print("\n") 
 end 
  
 #字符數(shù) 
 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 
  
 #實(shí)際調(diào)用的是WriterDecorator的write_line方法,只是在寫入的內(nèi)容前加上了編號(裝飾) 
 #所以說NumberingWriter對WriterDecorator的接口wirte_line進(jìn)行了裝飾 
 # 
 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. 實(shí)際調(diào)用的是SimpleWriter得write_line方法,將內(nèi)容寫入文件 
sw = SimpleWriter.new("mix.txt") 
#4. 實(shí)際調(diào)用的是NumberingWriter得write_line方法,對在輸入的數(shù)據(jù)前加上了編號 
#  然后傳給@real_writer,此時的@real_witer為sw 
nw = NumberingWriter.new(sw) 
#3. 實(shí)際調(diào)用的是TimeStampingWriter得write_line方法,對在輸入的數(shù)據(jù)前加上了時間戳 
#  然后傳給@real_writer,此時的@real_witer為nw 
tsw = TimeStampingWriter.new(nw) 
#2. 實(shí)際調(diào)用的是CheckSummingWriter得write_line方法,對輸入的數(shù)據(jù)進(jìn)行了字節(jié)數(shù)的統(tǒng)計 
#  然后傳給@real_writer,此時的@real_witer為tsw 
csw = CheckSummingWriter.new(tsw) 
#1. csw調(diào)用write_line 
csw.write_line("hello,world") 
puts csw.check_num 

兩種ruby風(fēng)格的裝飾模式應(yīng)用
 
(1)使用extend混入模塊

class SimpleWriter 
 def initialize(path) 
  @file = File.open(path,"w") 
 end 
 
 def write_line(line) 
  @file.print(line) 
  @file.print("\n") 
 end 
 
 #字符數(shù) 
 def pos 
  @file.pos 
 end 
 
 #它將會將文件指針指向文件的開頭 
 def rewind 
  @file.rewind 
 end 
 
 def close 
  @file.colse 
 end 
end 
 
#使用extend方法動態(tài)的混入模塊,來進(jìn)行裝飾 
 
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 

 
最后被加入的模塊,先被調(diào)用,然后通過super來調(diào)用父類的write_line方法。 
例子中先在文本的前面加上時間戳,在加入編號,最后寫入文件  

sw = SimpleWriter.new("out3.txt") 
sw.extend(NumberingWriter) 
sw.extend(TimeStampingWriter) 
sw.write_line("hello,ruby") 

 
(2)使用alias關(guān)鍵字

class SimpleWriter 
 def initialize(path) 
  @file = File.open(path,"w") 
 end 
 
 def write_line(line) 
  @file.print(line) 
  @file.print("\n") 
 end 
 
 #字符數(shù) 
 def pos 
  @file.pos 
 end 
 
 #它將會將文件指針指向文件的開頭 
 def rewind 
  @file.rewind 
 end 
 
 def close 
  @file.colse 
 end 
end 
 
 
ruby實(shí)現(xiàn)裝飾模式的另一種動態(tài)方法 : 
修改對象的實(shí)例方法, 所以在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") 

相關(guān)文章

  • Ruby中調(diào)用執(zhí)行shell命令的6種方法

    Ruby中調(diào)用執(zhí)行shell命令的6種方法

    這篇文章主要介紹了Ruby中調(diào)用執(zhí)行shell命令的6種方法,本文羅列了Ruby中可以調(diào)用和執(zhí)行Linux系統(tǒng)Shell命令的6個方法,需要的朋友可以參考下
    2014-10-10
  • 用Ruby實(shí)現(xiàn)一個單元測試框架的教程

    用Ruby實(shí)現(xiàn)一個單元測試框架的教程

    這篇文章主要介紹了用Ruby實(shí)現(xiàn)一個單元測試框架的教程,在檢測Ruby代碼bug的時候非常有用,需要的朋友可以參考下
    2015-04-04
  • 關(guān)于Ruby on Rails視圖編寫的一些建議

    關(guān)于Ruby on Rails視圖編寫的一些建議

    這篇文章主要介紹了關(guān)于Ruby on Rails視圖編寫的一些建議,有助于團(tuán)隊協(xié)作時對代碼的調(diào)試工作,需要的朋友可以參考下
    2015-08-08
  • 淺析Ruby中的類對象的概念

    淺析Ruby中的類對象的概念

    這篇文章主要介紹了Ruby中的類對象的概念,是Ruby學(xué)習(xí)當(dāng)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-05-05
  • 最新評論

    沂源县| 天祝| 陆丰市| 吉木乃县| 孟连| 申扎县| 应城市| 泸州市| 华池县| 大埔区| 卓资县| 萍乡市| 西盟| 资溪县| 宜昌市| 长海县| 永康市| 鄯善县| 永平县| 谢通门县| 陆良县| 陇西县| 新丰县| 藁城市| 横山县| 灌云县| 来宾市| 惠安县| 天峨县| 平和县| 盐津县| 无锡市| 永兴县| 当涂县| 嵊州市| 新闻| 稷山县| 娄烦县| 马公市| 巴青县| 景谷|