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

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

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

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

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

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

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

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

 

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

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

 

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

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

還不得不加一些調(diào)料在這些不同的咖啡中.這不是一個好辦法.下面進(jìn)入Ruby裝飾模式.像本文題目提到的那樣,這就是Ruby的8行代碼實現(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.然后你可以使用這個裝飾者就像直接使用裝飾好的對象一樣,默認(rèn)地,所有傳到裝飾者的信息都會被轉(zhuǎn)到被裝飾的對象那兒.你可以根據(jù)需要裝飾你的方法用來擴展:

 

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

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

 

  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)建幾個工廠方法:

  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的高動態(tài)語言特性,裝飾模式并不是在運行時擴展類的唯一方法,當(dāng)然,我只是喜歡ruby中用如此簡單的方法實現(xiàn)一個模式.在ruby中有關(guān)裝飾模式的更多信息和實現(xiàn),包括generic decorators和可選擇的傳統(tǒng)裝飾模式,請參考DecoratorPattern page at the RubyGarden.

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

 

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

 

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

2009-12-15 10:23:23

Ruby應(yīng)用技巧

2009-12-15 18:15:24

Ruby連接到LDAP

2009-12-15 18:24:02

Ruby連接到orac

2009-12-18 14:10:29

Ruby訪問剪貼板

2009-12-16 11:04:51

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

2009-12-17 10:18:17

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

2009-12-16 10:10:16

Ruby打開關(guā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-16 10:49:42

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

2009-12-29 17:56:47

Silverlight

2009-12-30 18:23:13

Silverlight

2010-01-25 11:09:58

Android Htt

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
點贊
收藏

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

主站蜘蛛池模板: 精品产国自在拍 | wwwxxx日本在线观看 | 久久一| 日韩免| 久久草视频 | 欧美黑人体内she精在线观看 | 久久久精品一区二区 | 日韩欧美精品在线 | 毛片99| 黄色片在线网站 | 亚洲精品久久嫩草网站秘色 | 99自拍视频 | 国产精品久久精品 | 一区二区三区日 | 五月天婷婷久久 | 特一级毛片 | 成人国产在线视频 | 亚洲日日操 | 日韩精品在线观看一区二区 | 先锋资源在线 | 久久一及片 | 亚洲精选一区二区 | 日韩中文字幕在线观看 | 欧美日韩精品中文字幕 | 午夜码电影 | 视频在线一区二区 | 成人av在线播放 | 成人教育av | 在线观看亚洲专区 | 欧美乱人伦视频 | 亚洲精品视频在线播放 | 国产欧美日韩在线一区 | 91久久精品一区二区二区 | 国产精品亚洲精品日韩已方 | 久久久国产亚洲精品 | 国产精品一区一区 | 日韩在线观看中文字幕 | 自拍偷拍亚洲欧美 | 99爱视频 | 欧美男人天堂 | av片网|