Ejemplo de MVC con el patrón observer.

0
(0)

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.

How useful was this post?

Click on a star to rate it!

Average rating 0 / 5. Vote count: 0

No votes so far! Be the first to rate this post.

2 thoughts on “Ejemplo de MVC con el patrón observer.

  1. @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!

Leave a Reply