# In software engineering, the composite pattern is a partitioning design # pattern. The composite pattern describes that a group of objects is to be # treated in the same way as a single instance of an object. The intent of a # composite is to "compose" objects into tree structures to represent part-whole # hierarchies. Implementing the composite pattern lets clients treat individual # objects and compositions uniformly # Tasks witch are used in composition class MonsterTask attr_reader :reward def initialize @reward = 100 end end class PuzzleTask attr_reader :reward def initialize @reward = 200 end end # Composer class Quest def initialize # Here we use Array as example of data structure for composition. Always is used Tree @tasks = [] end def <<(task) @tasks << task end def reward @tasks.inject(0){ |sum, task| sum += task.reward } end end # Usage quest = Quest.new quest << MonsterTask.new quest << PuzzleTask.new puts quest.reward # => 300