自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Ruby裝飾模式應用技巧分享

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

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

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

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

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

假設你要計算一杯咖啡的價錢.你有一個實現(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)建新類會導致在應用中出現(xiàn)類爆炸.為不同的咖啡和其調(diào)料(糖,奶...)組合創(chuàng)建新類是不現(xiàn)實的,這樣會變糟糕--如果我們有不同種類的咖啡怎么辦?然后我們

還不得不加一些調(diào)料在這些不同的咖啡中.這不是一個好辦法.下面進入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.然后你可以使用這個裝飾者就像直接使用裝飾好的對象一樣,默認地,所有傳到裝飾者的信息都會被轉(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,被裝飾過后,客戶代碼認為它還是A,呵呵).通過更進一步,你可以裝飾其它的裝飾者,只要它們有同樣的接口.通過為不同的"擴展"創(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 

 

當然,為方便著想我們情不自禁創(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)語言特性,裝飾模式并不是在運行時擴展類的唯一方法,當然,我只是喜歡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 

 

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

2009-12-15 10:23:23

Ruby應用技巧

2009-12-15 18:15:24

Ruby連接到LDAP

2009-12-15 18:24:02

Ruby連接到orac

2009-12-16 11:04:51

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

2009-12-17 10:18:17

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

2009-12-18 14:10:29

Ruby訪問剪貼板

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流程控制

2010-01-25 11:09:58

Android Htt

2009-12-29 17:56:47

Silverlight

2009-12-30 18:23:13

Silverlight

2009-12-16 10:49:42

Ruby操作二進制文件

2009-12-31 17:00:40

Silverlight

2010-01-04 14:35:55

Silverlight

2010-01-25 17:21:34

Android Act

2010-03-01 13:06:49

WCF繼承

2009-12-29 16:08:41

Silverlight
點贊
收藏

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