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

首頁 > 編程 > Ruby > 正文

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

2020-10-29 19:36:19
字體:
來源:轉載
供稿:網友

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

解決方案

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

 適用性

       以下情況使用Decorator模式

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

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

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

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") 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产精品久久久久久久牛牛| 精品美女视频在线观看免费软件| 精品一区二区在线欧美| 天天av天天爽| 国产精品被窝福利一区 | jizz亚洲大全| 欧美日韩在线视频免费观看| 免费黄网站在线观看| 国产精品偷乱一区二区三区| 尤物视频在线观看| 国产经典三级在线| 午夜影院免费看| 最近久乱中文字幕| 亚洲大香人伊一本线| 久蕉依人在线视频| 国产成免费视频| 欧美亚洲系列| 国产成人综合美国十次| www在线视频| 国产91久久久久| 久久精品无码一区二区日韩av| 国产黄视频在线观看| 免费在线黄色av| 国产不卡在线| 最新国产在线| 毛片网站在线观看| 亚洲综合在线不卡| 2021天堂中文幕一二区在线观| 激情丁香婷婷| 尤物在线精品视频| 精品一区二区观看| 最新黄网在线观看| 丁香婷婷在线| 天堂亚洲精品| 国产一级影片| 天天操夜夜操天天射| 国产在线一二三区| 激情在线视频播放| 狠狠干在线视频| 久久亚洲资源| 黄网址在线播放免费| 麻豆精品不卡国产免费看| 在线国产1区| 亚洲天堂久久久| 一本大道香蕉8中文在线视频| 国产福利小视频在线| 国产三级香港三韩国三级| 久久久久国产精品嫩草影院| 在线国产1区| 免费不卡中文字幕视频| 黄色免费av| 国产精品免费视频一区一| 国产高清在线a视频大全| 国产日韩网站| 精品国产丝袜高跟鞋| 99在线免费视频| av免费网站在线观看| 日本视频一二三区中文字幕| 欧美性猛交xxxx免费看蜜桃| 另类综合图区| 国产高清视频在线观看| 国产激情99| 在线国产1区| 免费a在线看| 国产丝袜在线播放| 亚洲欧美精选| 国产一区二区三区福利| 精品福利影院| 国产乱妇乱子| 国产丝袜在线观看视频| 午夜在线观看91| 国产麻豆精品视频一区二区| 国产成人综合美国十次| 免费看成年人视频在线观看| 国产深夜福利| 欧美高清视频| 91午夜在线| 天堂中文在线视频| 羞羞视频在线免费看| 天堂资源在线中文| 免费高清视频日韩| 在线免费黄色毛片| 国产精品粉嫩av| 国产尤物一区二区三区| 亚洲精品国自产拍在线观看| 国产蜜臀av在线播放| 在线观看国产视频| 国产导航在线| 国产高清免费av在线| 二人午夜免费观看在线视频| 伊人国产在线看一| 国产一级二级三级在线观看| 精品孕妇一区二区三区| www久久日com| 亚洲一本大道| 天天插天天色| 日本国产在线| 女人色在线免费视频| 不卡av免费观看| 日本动漫理论片在线观看网站| 国产成人精品实拍在线| 国产精品蜜臀| 97一区二区三区| 在线看黄网站| 九七电影韩国女主播在线观看| 久久久久久日本一区99| 美女网站在线观看| 国产中文字幕第一页| 日本中文字幕视频在线| 午夜视频在线| 精品无吗乱吗av国产爱色| 精品美女在线观看视频在线观看| 9999在线视频| 青青草视频在线观看| 国产在线高潮| 国产超碰在线观看| 免费一区二区在线观看| 国产理论片免费观看| 国产黄在线看| 亚洲欧美精品日韩欧美| 欧美成人久久电影香蕉| 中文字幕中文字幕在线中高清免费版| 成年网在线观看免费观看网址| 99视频免费在线观看| 国产福利在线| www在线播放| 国产精品探花在线| 亚洲图区欧美| 五月综合激情在线| 在线天堂中文www视软件| 超碰在线影院| 亚洲欧美中文字幕在线观看| 国产理论电影在线观看| 91视频黄色| 国产亚洲精品久久久久久移动网络| 国产馆av播放| 国产精品一区二区资源| 国产福利免费观看| 久草视频国产| 亚洲欧美精品中文第三| 最新黄网在线观看| 久久国产综合视频| 夜夜爽夜夜操| 18成年在线观看| 国产午夜电影| 国产麻豆精品视频一区二区| 在线观看av中文| 国产特级嫩嫩嫩bbb| 黄色一级视频网站| 狂野欧美性猛交xxxx乱大交| 亚洲视频在线网| 国产成人精品久久一区二区小说| 在线观看中文字幕| 在线中文字幕av| 国产激情在线视频| 国产精品人人| 精品推荐国产麻豆剧传媒| 国产视频二区三区| 国产丝袜自拍| 国产黄在线看| 精品视频vs精品视频| 精品亚洲综合| 四虎精品成人a在线观看| 在线免费观看高清视频色| 国产黄视频网站| 国产成人精品实拍在线| 国产xxx在线| 国产区视频在线观看| 91xxx在线观看| 国产日产一区二区| 国产黄色免费电影| 伊人网在线视频| 四虎成人免费| 久热免费在线视频| 中文字幕在线影视资源| 国产三级视频在线播放线观看| 国产精品日日爱| 精品福利视频导航大全| 在线免费看黄网站| 开心丁香婷婷深爱五月| 中文字幕一区免费| 亚洲视频网站在线| 免费看的毛片| 国产成人夜间影院在线观看| 18av在线视频| 国产尤物视频| 在线视频二区| 国内外激情在线| 国产馆av播放| 久久国产情侣| 精品视频vs精品视频| 九色成人在线| av福利在线观看| 国产一级网站视频在线| 在线观看中文| 国产三级av在线| 免费精品国产自产拍在| 中中文字幕av在线| 四虎在线免费视频| 国产偷倩在线播放|