亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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。

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97精品欧美一区二区三区| 国产欧美日韩丝袜精品一区| 精品国产一区二区三区四区在线观看| 国产成人精品999| 亚洲国产精彩中文乱码av在线播放| 久久在线观看视频| 成人午夜黄色影院| 国产精品网站入口| 欧美日韩在线观看视频小说| 久久理论片午夜琪琪电影网| 91chinesevideo永久地址| 亚洲电影在线观看| 国产z一区二区三区| 亚洲国产精久久久久久久| 久久琪琪电影院| 亚洲新中文字幕| 国产视频欧美视频| 国产精品一区二区三区毛片淫片| 爱福利视频一区| 欧美国产日韩精品| 日韩欧美在线第一页| 日韩av电影免费观看高清| 国产国产精品人在线视| 欧美性jizz18性欧美| 97在线日本国产| 日韩国产激情在线| 午夜精品福利视频| 日韩女优在线播放| 久久99国产精品久久久久久久久| 久久成人在线视频| 久久成人在线视频| 欧美香蕉大胸在线视频观看| 日韩亚洲国产中文字幕| 92国产精品久久久久首页| 欧美成人黄色小视频| 日韩中文字幕精品视频| 国产ts人妖一区二区三区| 日韩欧美黄色动漫| 91精品一区二区| 在线观看日韩av| 国产日韩在线免费| 亚洲精品免费av| 国产综合视频在线观看| 欧美激情视频三区| 日本老师69xxx| 97国产一区二区精品久久呦| 亚洲视频在线观看免费| 久久久成人精品视频| 国产一区二中文字幕在线看| 日韩欧美精品免费在线| 欧美日韩国产一中文字不卡| 国产九九精品视频| 日韩国产欧美精品在线| 欧美激情亚洲视频| 欧美精品亚州精品| 亚洲欧洲中文天堂| 欧美日韩国内自拍| 色悠悠国产精品| 亚洲午夜久久久影院| 日韩av影视综合网| 91久久久久久久| 日韩黄色在线免费观看| 97视频免费在线看| 亚洲va久久久噜噜噜| 国内精品一区二区三区| 欧美激情xxxx性bbbb| 欧美性猛交xxxx偷拍洗澡| 日韩精品中文字幕在线播放| 欧美贵妇videos办公室| 91成人性视频| 亚洲国产精品嫩草影院久久| 成人在线视频网站| 国产精品久久久久免费a∨大胸| 国产欧美日韩亚洲精品| 午夜免费在线观看精品视频| 高清欧美性猛交xxxx| 色偷偷888欧美精品久久久| 亚洲美女又黄又爽在线观看| 91免费在线视频| 97av在线播放| 成人国产精品久久久久久亚洲| 欧美日韩综合视频| 亚洲国产三级网| 久久伊人精品天天| 中文字幕国产日韩| 国产91色在线免费| 国产精品久久久久高潮| 国产精品美女主播在线观看纯欲| 亚洲男女自偷自拍图片另类| 精品久久久久久久久久国产| 欧美色视频日本版| 国产精品免费视频xxxx| 久久男人av资源网站| 日韩精品免费一线在线观看| 精品国偷自产在线视频99| 亚洲一区二区三区xxx视频| 国产成人精品久久| 国产精品女人网站| 亚洲精选一区二区| 色综合导航网站| 日韩免费在线观看视频| 亚洲一区二区三区乱码aⅴ蜜桃女| 欧美精品videos另类日本| 国产欧美一区二区三区久久人妖| 浅井舞香一区二区| 欧美久久精品午夜青青大伊人| 最新国产精品拍自在线播放| www.精品av.com| 欧美极品少妇xxxxⅹ免费视频| 美女国内精品自产拍在线播放| 国产精品青草久久久久福利99| 久久亚洲精品网站| 国产精品欧美一区二区| 4k岛国日韩精品**专区| 91在线观看欧美日韩| 国产精品高清在线| 伊人伊成久久人综合网站| 久久国产色av| 国产视频在线一区二区| 国产一区二区三区视频| 97成人精品视频在线观看| 久久视频免费在线播放| 热re99久久精品国产66热| 亚洲a一级视频| 97国产成人精品视频| 91在线视频九色| 国产亚洲精品美女久久久久| 国产精品久久二区| 亚洲日本成人网| 青青a在线精品免费观看| 久久男人av资源网站| 久久中文字幕在线视频| 国产精品日韩欧美| 91亚洲va在线va天堂va国| 色悠悠国产精品| 97香蕉久久夜色精品国产| 欧美一级在线亚洲天堂| 日韩av第一页| 成人精品福利视频| 97视频在线观看成人| 91po在线观看91精品国产性色| 日韩电影中文字幕| 亚洲xxxx做受欧美| 欧美片一区二区三区| 日韩免费高清在线观看| 亚洲国产中文字幕久久网| 91精品久久久久久久久久| 韩曰欧美视频免费观看| 亚洲第一页中文字幕| 欧美重口另类videos人妖| 91美女高潮出水| 国产综合视频在线观看| 亚洲欧美日韩久久久久久| 亚洲电影在线观看| 日韩av在线高清| 日韩电影免费在线观看中文字幕| 久久久久久中文| 日韩欧美在线观看视频| 久久这里只有精品99| 亚洲精品视频久久| 欧美日韩福利在线观看| 亚洲伊人第一页| 91久热免费在线视频| 91av在线免费观看视频|