国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > Ruby > 正文

實例講解Ruby使用設計模式中的裝飾器模式的方法

2020-02-24 15:36:39
字體:
來源:轉載
供稿:網友

如果您一直致力于面向對象的開發,向類或對象添加行為,并使用繼承機制,那么這是所有面向對象語言的基本特性,武林技術頻道小編今天實例講解Ruby使用設計模式中的裝飾器模式的方法。

概述
? ? ? ?如果已經存在的一個類缺少某些方法,或者須要給方法添加更多的功能(魅力),你也許會僅僅繼承這個類來產生一個新類—這建立在額外的代碼上。
????? 通過繼承一個現有類可以使得子類在擁有自身方法的同時還擁有父類的方法。但是這種方法是靜態的,用戶不能控制增加行為的方式和時機。如果? 你希望改變一個已經初始化的對象的行為,你怎么辦?或者,你希望繼承許多類的行為,改怎么辦?前一個,只能在于運行時完成,后者顯然時可能的,但是可能會導致產生大量的不同的類—可怕的事情。
問題
????? 你如何組織你的代碼使其可以容易的添加基本的或者一些很少用到的 特性,而不是直接不額外的代碼寫在你的類的內部?

解決方案

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

?適用性

?????? 以下情況使用Decorator模式

  • ????? 在不影響其他對象的情況下,以動態、透明的方式給單個對象添加職責。
  • ????? 處理那些可以撤消的職責。
  • ????? 當不能采用生成子類的方法進行擴充時。一種情況是,可能有大量獨立的擴展,

????? 為支持每一種組合將產生大量的子類,使得子類數目呈爆炸性增長。

????? 另一種情況可能是因為類定義被隱藏,或類定義不能用于生成子類。
?
實例

ruby.html="" tags="">ruby;">class SimpleWriter  def initialize(path)   @file = File.open(path,"w")  end    def write_line(line)   @file.print(line)   @file.print("/n")  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("/n")  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 

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

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("/n")  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") 

  以上就是今天給大家分享的實例講解Ruby使用設計模式中的裝飾器模式的方法,希望可以幫助到需要的朋友,如果覺得還不錯,可以分享給身邊的朋友哦,想要了解更多,推薦大家關注js.Vevb.com。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
黄色免费av| 在线中文字幕观看| 性网站在线看| sese在线视频| 久热国产视频| 国产一二三区在线观看| 国产在线第一页| 国产精品外围在线观看| 天天av综合网| 在线观看视频污| 国产亚洲精品自在线观看| 国产成人综合亚洲欧美在| 在线观看的网站你懂的| 男人天堂v视频| 国产欧美日韩精品综合| 亚洲精品少妇久久久久久| 午夜不卡视频| 午夜在线不卡| 国产一卡二卡3卡4卡四卡在线| 天天操天天是| 精品国产二区三区| 国产麻豆综合视频在线观看| 精品国产美女福利到在线不卡 | 18激情网站| 在线视频中文字幕| 国内自拍视频在线观看| 在线观看午夜av| 国产理论电影在线观看| 欧美人成在线观看网站高清| 国产成人亚洲欧美电影| 国产中文第一页| 天天插天天狠天天透| 国产成人精品18| 中文字幕在线播放网址| www.操.com| 亚洲精品乱码电影在线观看| 国产高清自拍视频在线观看| 1区不卡电影| 国产一起色一起爱| 青青草在线播放| 亚洲综合激情六月婷婷在线观看| 国产一区二区三区福利| 激情小说 在线视频| 日本一卡二卡四卡精品| 99re6在线视频精品免费| 国产一区二区三区不卡在线| 久久精品视频观看| 久久99亚洲网美利坚合众国| 免费看黄视频网站| 久久久久久91精品色婷婷 | 亚洲字幕成人中文在线观看| 在线天堂视频| 91中文字幕| aaa大片在线观看| 亚洲精品在线播放视频| 亚洲精品乱码电影在线观看| jizz国产| 国产亚洲精品拍拍拍拍拍| 国产特级毛片| 在线亚洲电影| 免费黄色网页在线观看| 国产免费黄视频在线观看| 国产一二三区精品视频| 伊人免费视频| 美女av在线播放| 豆国产97在线|亚洲| 国产欧美黑人| 91久久精品国产性色| 天天草天天操| 中文字幕乱在线伦视频乱在线伦视频 | 国产一起色一起爱| 中文字幕2020第一页| 久热免费在线视频| 国产9色视频| 国产原创在线播放| 尤物在线视频观看| 国产一卡2卡3卡4卡网站免费| 精品视频一区二区观看| 国产理论在线观看| 欧美在线中文| 国产日本在线观看| 麻豆精品传媒视频观看| 在线天堂视频| 国产天堂在线播放视频| 九九热在线观看视频| 四虎在线免费视频| 在线成人综合色一区| 国产精品人人爱一区二区白浆| 尤物视频在线观看视频| 中文字幕不卡| 国产卡1卡2卡三卡在线| 九九热免费在线视频| jizz国产| xxx国产精品| 在线免费看黄av| 国产一区二区三区不卡免费观看| 麻豆精品免费视频入口| 亚洲字幕成人中文在线观看| 国产精品秘入口| 国产天堂在线| 国产精品免费91| 国产香蕉视频在线看| 超碰在线免费播放| 国产在线三区| 免费视频中文字幕| 黄色免费av| 国产一级影片| 国产精品毛片一区二区三区四区| 天天av天天爽| 国产精品视频h| 国产一区久久精品| 国产黄色大片在线观看| av二区三区| 免费网站看黄yyy222| 黄色三级视频在线观看| 黄色在线视频观看网站| 成年黄网站在线观看免费| 免费a级在线播放| 国产九九在线| 最近中文字幕mv2018在线高清| 国产精品入口免费麻豆| 国产精品69xx| 亚洲欧洲成人| 精品中文字幕不卡在线视频| 中文字幕视频在线| 国产高清一区二区三区视频| av高清在线| 91caoporn在线| 国产深夜视频在线观看| 尤物在线精品视频| 国产美女被草| 精品一二三区视频| 开心丁香婷婷深爱五月| 成人日韩欧美| 91精品专区| 亚洲国产成人综合| 免费不卡中文字幕视频| 丁香花高清在线观看完整版 | 国产超碰97| 免费国产视频| 高清在线观看av| 国产美女福利在线| 国产精品入口免费麻豆| 欧美性猛交xxxx免费看久久| 国产在线一二三| 国产aa视频| www.av在线视频| 国产91久久久久蜜臀青青天草二| 影音先锋中文字幕在线| 在线天堂视频| 国产免费福利| 国产成人综合美国十次| 中文字幕中文字幕在线中高清免费版| 国产在线一区二区视频| 国产国产国产国产国产国产| av网址在线看| 91高清国产| 久久99亚洲网美利坚合众国| 国产一级在线观看www色| 天堂在线国产| 国产中文字幕在线| 日本不卡视频一区二区| 国产黄色大片在线观看| 欧美精品久久久久久久小说| 天堂资源在线中文| 国产字幕在线看| 尤物视频在线观看视频| 国产精品理人伦一区二区三区| www.国产精| 青青草在线免费观看| 精品推荐蜜桃传媒| 国产一区二区三区福利| 九九热在线观看| 91av资源在线| 免费在线黄色网址 | 国产网站免费观看| 狠狠综合久久久综合| 国产你懂的在线观看| 国产一二三区在线| 免费a级毛片在线观看| 亚洲精品视频区| 激情丁香婷婷| 国产理论片免费观看| 国产男女猛烈无遮挡免费视频| 青青青国产视频| 国产鲁鲁视频在线观看免费| 可以免费看污视频的网站| 青青草原国产在线| 丁香综合五月| 国产99在线|亚洲| av丝袜在线| 性国产高清在线观看| gogogogo高清视频在线| a视频在线看| www操操操| 国产精品自拍在线观看| 亚洲男人的天堂成人| 欧美96在线| 国产中文在线观看| 中文字幕在线观看播放|