Ejemplo de MVC con el patrón observer.

Me gusta la nueva versión de cofradia. ;). Hace un año quería hacer un curso de Ruby en línea; no lo llevé acabo sin embargo, pienso ir publicando código que
considero le puede interesar a alguien.

temp
Este ejemplo en java
me pareció muy ilustrativo y decidí implementarlo en Ruby, es el metapatrón MVC
codificado con el patrón observer. El ejemplo consta de una clase para cada componente
TemperatureModel, TemperatureView(GUI) y el TemperatureController, la gui
está desarrollada con ruby-gtk y glade.

El controlador: TemperatureController.rb

require "observer"
require 'TemperatureModel.rb'
require 'TemperatureView.rb'
 
class TemperatureWatcher
 
  def initialize(t,g)
    t.add_listener(self)
    @gui = g
  end
 
  def celsius_changer(temp)
     @newc = temp
     @newf = @newc*9.0/5.0 + 32.0
     @gui.setDisplayF(@newf)
     @gui.setDisplayC(@newc)
     @gui.setTemp(@newc)
  end
 
  def faranheit_changer(temp)
     @newf = temp
     @newc = (@newf -32.0)*5.0/9.0
     @gui.setDisplayF(@newf)
     @gui.setDisplayC(@newc)
     @gui.setTemp(@newc)
  end
 
end
 
INICIALTEMP = 32.0
 
temperature = TemperatureModel.new
tgui        = TemperatureGUI.new(INICIALTEMP,temperature)
watcher     = TemperatureWatcher.new(temperature,tgui)
 
Gtk.init
Gtk.main

El modelo: TemperatureModel.rb

class TemperatureModel
 
   def initialize
    @listeners = []
   end
 
   def add_listener(listener)
    @listeners << listener
   end
 
   def upF(temp)
      @temp = temp
      @temp += 1
      @listeners.each {|l| l.faranheit_changer(@temp) }
   end
 
   def downF(temp)
      @temp = temp
      @temp -= 1
      @listeners.each {|l| l.faranheit_changer(@temp) }
   end
 
   def upC(temp)
      @temp = temp
      @temp += 1
      @listeners.each {|l| l.celsius_changer(@temp) }
   end
 
   def downC(temp)
      @temp = temp
      @temp -= 1
      @listeners.each {|l| l.celsius_changer(@temp) }
   end
 
   def newtC(temp)
      @temp = temp
      @listeners.each {|l| l.celsius_changer(@temp) }
   end
 
end

El gui: TemperatureView.rb

require 'libglade2'
 
class TemperatureGUI
 
  def initialize(temp,temperature)
    @temp, @temperature = temp,temperature
    @glade = GladeXML.new("temp.glade") {|handler| method(handler)}
    @entryF = @glade["entry1"]
    @entryC = @glade["entry2"]
    @vscale = @glade["vscale1"]
    @entryF.set_text(@temp.to_s)
    @entryC.set_text(((5.0/9.0)*(@temp-32.0)).to_s)
    @vscale.set_value((5.0/9.0)*(@temp-32.0))
    f_up_button = @glade["button1"]
    f_down_button = @glade["button2"]
    c_up_button = @glade["button3"]
    c_down_button = @glade["button4"]
  end
 
  def setDisplayF(newF)
    @newF = newF
    @entryF.set_text("#{@newF}")
  end
 
  def setDisplayC(newC)
    @newC = newC
    @entryC.set_text("#{@newC}")
  end
 
  def getDisplayF
    @entryF.text.to_f
  end
 
  def getDisplayC
    @entryC.text.to_f
  end
 
  def procScale
      @v = @vscale.value
      @temperature.newtC(@v)
  end
 
  def procEntryC
      @v = getDisplayC
      @temperature.newtC(@v)
  end
 
  def procEntryF
      @nv = getDisplayF
      @v = (5.0/9.0)*(@nv-32.0)
      @temperature.newtC(@v)
  end
 
  def upF
      @temp =  getDisplayF
      @temperature.upF(@temp)
  end
 
  def downF
      @temp =  getDisplayF
      @temperature.downF(@temp)
  end
 
  def upC
      @temp =  getDisplayC
      @temperature.upC(@temp)
  end
 
  def downC
      @temp =  getDisplayC
      @temperature.downC(@temp)
  end
 
  def setTemp(t)
    @t = t
    @vscale.set_value(@t)
  end
 
  def quit
    Gtk.main_quit
  end
 
end

Todos los archivos los pueden bajar de aqui, incluyendo el archivo glade.

Tags:


5 votes, average: 5.00 out of 55 votes, average: 5.00 out of 55 votes, average: 5.00 out of 55 votes, average: 5.00 out of 55 votes, average: 5.00 out of 5 (5 votes, average: 5.00 out of 5)
You need to be a registered member to rate this post.
Loading...
Programacion | RSS 2.0 |     1,381 views

RSS feed

2 Comments »

Comment by ddoctor
2008-12-12 23:53:54

Muy buen ejemplo,parece que últimamente ha estado ganando muchos adeptos Ruby, por aquí, bien!!!.
Sobre el curso de Ruby en línea suena muy bien la idea.

 
Comment by damog
2008-12-15 20:12:41

@emeza: ¡Chido! Te recomiendo también que pongas tu código en GitHub, por dos razones. Una, porque está chido 🙂 y dos, porque hay mucha gente Rubyist que está participando. Y sé que eres uno de los pocos que como yo usábamos Ruby desde mucho antes que fuera el hype.

Saludos!

 
Name (required)
E-mail (required - never shown publicly)
URI
Your Comment (smaller size | larger size)
You may use <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> in your comment.

Trackback responses to this post