成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Ruby裝飾模式應(yīng)用技巧分享

開發(fā) 開發(fā)工具
Ruby裝飾模式是設(shè)計(jì)模式的一種。在實(shí)際應(yīng)用中可以像被裝飾的對(duì)象一下工作,并且其保持某些恒等性是非常好的。不過它并不是在運(yùn)行時(shí)唯一的方法。

Ruby語言中,是一種比較簡(jiǎn)便的編程語言。我們可以通過它在編程中獲得很大的快樂感。在這里我們會(huì)未大家介紹一下Ruby裝飾模式的相關(guān)應(yīng)用技巧。#t#

Ruby裝飾模式是設(shè)計(jì)模式之一,它允許你在運(yùn)行時(shí)動(dòng)態(tài)地為一個(gè)存在的對(duì)象添加特性.在一個(gè)對(duì)象有很多種可以有不同方式組合的可以影響其特性的

變量時(shí)特別有用(dingsea:沒看懂?翻譯這段比較YY,以上大概是出版社的風(fēng)格,其實(shí)用例子比較容易理解,向下看)

這個(gè)短小精悍的Ruby裝飾模式實(shí)現(xiàn),總結(jié)了這個(gè)星球上我***的最火的動(dòng)態(tài)語言.
我從Eric Freeman, Elisabeth Freeman, Kathy Sierra, 和Bert Bates他們寫的杰出的Head First Design Patterns 一書中借取一個(gè)例子.

假設(shè)你要計(jì)算一杯咖啡的價(jià)錢.你有一個(gè)實(shí)現(xiàn)了cost()方法的咖啡類.此例中我們出于示例目的硬編碼其價(jià)格:

 

  1. class Coffee  
  2. def cost  
  3. 2  
  4. end  
  5. end 

很好.不過如果我們要知道一杯加奶的咖啡多少錢怎么辦?我們有一個(gè)新類:

 

  1. class WhiteCoffee  
  2. def cost  
  3. 2.4  
  4. end  
  5. end 

好,但是現(xiàn)在我們要加奶油的咖啡怎么辦?再要撒些東西在上邊呢?(原文"And sprinkles",個(gè)人理解,歡迎討論).明顯地,不停地創(chuàng)建新類會(huì)導(dǎo)致在應(yīng)用中出現(xiàn)類爆炸.為不同的咖啡和其調(diào)料(糖,奶...)組合創(chuàng)建新類是不現(xiàn)實(shí)的,這樣會(huì)變?cè)愀?-如果我們有不同種類的咖啡怎么辦?然后我們

還不得不加一些調(diào)料在這些不同的咖啡中.這不是一個(gè)好辦法.下面進(jìn)入Ruby裝飾模式.像本文題目提到的那樣,這就是Ruby的8行代碼實(shí)現(xiàn):

  1. module Decorator  
  2. def initialize(decorated)  
  3. @decorateddecorated = decorated  
  4. end  
  5. def method_missing
    (method, *args)  
  6. args.empty? ? @decorated.send
    (method) : @decorated.send
    (method, args)  
  7. end  
  8. end 

 

這就是你所要的.你可以在任何你想要裝飾的類中包含以上module.然后你可以使用這個(gè)裝飾者就像直接使用裝飾好的對(duì)象一樣,默認(rèn)地,所有傳到裝飾者的信息都會(huì)被轉(zhuǎn)到被裝飾的對(duì)象那兒.你可以根據(jù)需要裝飾你的方法用來擴(kuò)展:

 

  1. class Milk  
  2. include Decorator  
  3. def cost  
  4. @decorated.cost + 0.4  
  5. end  
  6. end 

那么怎樣解決我們剛開頭的咖啡問題呢?Ruby裝飾模式在實(shí)戰(zhàn)中的強(qiáng)大之處就在于他們可以像被裝飾的對(duì)象一樣工作(dingsea:嗯,大概是說,類A,被裝飾過后,客戶代碼認(rèn)為它還是A,呵呵).通過更進(jìn)一步,你可以裝飾其它的裝飾者,只要它們有同樣的接口.通過為不同的"擴(kuò)展"創(chuàng)建裝飾者,我們可以使用組合的裝飾者創(chuàng)建咖啡類并計(jì)算此咖啡的總價(jià).

 

  1. class Whip  
  2. include Decorator  
  3. def cost   
  4. @decorated.cost + 0.2  
  5. end  
  6. end  
  7. class Sprinkles  
  8. include Decorator  
  9. def cost  
  10. @decorated.cost + 0.3  
  11. end  
  12. end  
  13. Whip.new(Coffee.new).cost  
  14. #=> 2.2  
  15. Sprinkles.new(Whip.new
    (Milk.new(Coffee.new))).cost  
  16. #=> 2.9 

 

當(dāng)然,為方便著想我們情不自禁創(chuàng)建幾個(gè)工廠方法:

  1. class CoffeeFactory  
  2. def self.latte  
  3. SteamedMilk.new(Espresso.new)  
  4. end  
  5.  
  6. def self.cappuccino  
  7. Sprinkles.new(Cream.new
    (Milk.new(Coffee.new)))  
  8. end  
  9. end  
  10.  
  11. order = Order.new  
  12. order.add(Coffee.new)  
  13. order.add(CoffeeFactory
    .cappuccino)  
  14. puts order.total 

 

由于Ruby的高動(dòng)態(tài)語言特性,裝飾模式并不是在運(yùn)行時(shí)擴(kuò)展類的唯一方法,當(dāng)然,我只是喜歡ruby中用如此簡(jiǎn)單的方法實(shí)現(xiàn)一個(gè)模式.在ruby中有關(guān)裝飾模式的更多信息和實(shí)現(xiàn),包括generic decorators和可選擇的傳統(tǒng)裝飾模式,請(qǐng)參考DecoratorPattern page at the RubyGarden.

***,在使用Ruby裝飾模式時(shí)保持某些恒等性是很好的.上邊提到的RubyGarden的網(wǎng)頁里是其中一種方法.同時(shí)我們沒有使用繼承,保留繼承這一特性是很好的:

 

  1. CoffeeFactory.
    cappucino.kind_of? Coffee  
  2. #=> true 

 

責(zé)任編輯:曹凱 來源: 博客園
相關(guān)推薦

2009-12-15 10:23:23

Ruby應(yīng)用技巧

2009-12-15 18:24:02

Ruby連接到orac

2009-12-15 18:15:24

Ruby連接到LDAP

2009-12-16 10:10:16

Ruby打開關(guān)閉文件

2009-12-18 14:10:29

Ruby訪問剪貼板

2009-12-17 10:18:17

Ruby創(chuàng)建構(gòu)造器

2009-12-16 11:04:51

Ruby操作文件權(quán)限

2009-12-17 17:37:42

Ruby on Rai

2009-12-15 14:51:50

Ruby繼承

2009-12-16 15:46:41

Ruby on rai

2009-12-15 09:56:51

Ruby流程控制

2009-12-29 17:56:47

Silverlight

2009-12-30 18:23:13

Silverlight

2010-01-25 11:09:58

Android Htt

2009-12-16 10:49:42

Ruby操作二進(jìn)制文件

2009-12-29 16:08:41

Silverlight

2010-01-25 16:08:37

Android ADB

2010-02-01 11:13:00

C++ Traits

2009-12-31 17:00:40

Silverlight

2010-01-04 14:35:55

Silverlight
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩国产欧美 | 日日操夜夜操天天操 | 久久久成人免费一区二区 | 久久免费观看一级毛片 | 亚洲欧洲一区 | 欧美激情欧美激情在线五月 | 黄篇网址| 91免费小视频 | 91国产视频在线观看 | 久久极品 | 在线国产视频 | 夜夜夜操 | 亚洲精品一区二区三区在线 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 热久久久 | 香蕉一区 | 射久久 | 96av麻豆蜜桃一区二区 | 日本三级电影在线免费观看 | 97色伦网 | 国产三级一区二区三区 | 在线国产一区 | 97天天干| 成人小视频在线观看 | 罗宾被扒开腿做同人网站 | 一区二区三区视频在线观看 | 亚洲免费在线观看 | 日本精品免费在线观看 | 日本福利在线观看 | 国产精品国产精品国产专区不卡 | 黄色片大全在线观看 | 久草免费电影 | 在线视频一区二区 | 国产精品完整版 | 久久久久亚洲精品 | 成人福利在线观看 | 色综合天天综合网国产成人网 | 一区二区三区av | 欧产日产国产精品99 | 中文字幕在线电影观看 | 久久精品视频网站 |