Created
June 16, 2016 23:18
-
-
Save gsmendoza/f310265fa7783e3dc2d9c23408af7e0c to your computer and use it in GitHub Desktop.
Head First Design Patterns - Decorator - Starbuzz
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'attr_extras' | |
module StarbuzzCoffee | |
class Beverage | |
attr_reader :description | |
def initialize | |
@description = "Unknown Beverage" | |
end | |
def cost | |
raise NotImplementedError | |
end | |
end | |
class CondimentDecorator < Beverage | |
def description | |
raise NotImplementedError | |
end | |
end | |
class Espresso < Beverage | |
def initialize | |
@description = 'Espresso' | |
end | |
def cost | |
1.99 | |
end | |
end | |
class HouseBlend < Beverage | |
def initialize | |
@description = 'House Blend Coffee' | |
end | |
def cost | |
0.89 | |
end | |
end | |
class DarkRoast < Beverage | |
def initialize | |
@description = 'Dark Roast Coffee' | |
end | |
def cost | |
0.99 | |
end | |
end | |
class Mocha < CondimentDecorator | |
pattr_initialize :beverage | |
def description | |
"#{beverage.description}, Mocha" | |
end | |
def cost | |
beverage.cost + 0.20 | |
end | |
end | |
class Soy < CondimentDecorator | |
pattr_initialize :beverage | |
def description | |
"#{beverage.description}, Soy" | |
end | |
def cost | |
beverage.cost + 0.15 | |
end | |
end | |
class Whip < CondimentDecorator | |
pattr_initialize :beverage | |
def description | |
"#{beverage.description}, Whip" | |
end | |
def cost | |
beverage.cost + 0.10 | |
end | |
end | |
def self.main | |
beverages = [] | |
beverages[0] = Espresso.new | |
beverages[1] = DarkRoast.new | |
beverages[1] = Mocha.new(beverages[1]) | |
beverages[1] = Mocha.new(beverages[1]) | |
beverages[1] = Whip.new(beverages[1]) | |
beverages[2] = HouseBlend.new | |
beverages[2] = Soy.new(beverages[2]) | |
beverages[2] = Mocha.new(beverages[2]) | |
beverages[2] = Whip.new(beverages[2]) | |
beverages.each do |beverage| | |
puts "#{beverage.description} $#{beverage.cost}" | |
end | |
end | |
end | |
StarbuzzCoffee.main |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment