Skip to content

Instantly share code, notes, and snippets.

@gsmendoza
Created June 16, 2016 23:18
Show Gist options
  • Save gsmendoza/f310265fa7783e3dc2d9c23408af7e0c to your computer and use it in GitHub Desktop.
Save gsmendoza/f310265fa7783e3dc2d9c23408af7e0c to your computer and use it in GitHub Desktop.
Head First Design Patterns - Decorator - Starbuzz
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