La Cofradía Digital

Hermandad informática


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 responses to “Ejemplo de MVC con el patrón observer.”

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

  2. @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