2009-05-04 :-)
_ 朝ッ
0730 起床
_ [デザインパターン][Strategy]Head First デザインパターンを写経する - 1章 Strategy パターン
サンプルコードをそのまま Ruby で書いたつもり。Java でいう interface は Ruby に存在するの?
#!/usr/bin/ruby -Ks
class Duck
  @@quackBehavior = nil
  @@flyBehavior = nil
  def initialize
  end
  def performFly
    @@flyBehavior.fly
  end
  def performQuack
    @@quackBehavior.quack
  end
  def swim
    puts "すべての鴨は浮かびます。おとりの鴨でも!"
  end
end
class FlyBehavior
  def fly
  end
end
class FlyWithWings < FlyBehavior
  def fly
    puts "飛んでいます!"
  end
end
class FlyNoWay < FlyBehavior
  def fly
    puts "飛べません!"
  end
end
class QuackBehavior
  def quack
  end
end
class Quack < QuackBehavior
  def quack
    puts "ガーガー"
  end
end
class MuteQuack < QuackBehavior
  def quack
    puts "<沈黙>>"
  end
end
class Squack < QuackBehavior
  def quack
    puts "キューキュー"
  end
end
class MallardDuck < Duck
  def initialize
    @@quackBehavior = Quack.new
    @@flyBehavior = FlyWithWings.new
  end
  def display
    puts "本物のマガモです"
  end
end
def main
  mallard = MallardDuck.new
  mallard.performQuack
  mallard.performFly
end
main
% ./duck.rb ガーガー 飛んでいます!
4873112494
_ [Observer][デザインパターン]Head First デザインパターンを写経する - 2章 Observer パターン
Mix-in を使うといいのかしら。Observer に関しては lib/ruby/1.8/observer.rb が Ruby での Observer 実装のようだ。
#!/usr/bin/ruby -Ks
module Subject
  def registerObserver( observer )
  end
  def removeObserver( observer )
  end
  def notifyObservers
  end
end
module Observer
  def update( temp, humidity, pressure )
  end
end
module DisplayElement
  def display
  end
end
class WeatherData
  include Subject
  @temprature
  @humidity
  @pressure
  def initialize
    @observers = []
  end
  def registerObserver( observer )
    @observers << observer
  end
  def removeObserver( observer )
    @observers.delete( observer )
  end
  def notifyObservers
    @observers.each {|o|
      o.update( @temprature, @humidity, @pressure )
    }
  end
  def measurementsChanged
    notifyObservers
  end
  def setMeasurements( temprature, humidity, pressure )
    @temprature = temprature
    @humidity = humidity
    @pressure = pressure
    measurementsChanged
  end
end
class CurrentConditionDisplay
  include Observer
  include DisplayElement
  def initialize( weatherData )
    @weatherdata = weatherData
    @weatherdata.registerObserver( self )
  end
  def update( tempreture, humidity, pressure )
    @tempreture = tempreture
    @humidity = humidity
    display
  end
  def display
    puts "現在の気象状況: 温度#{@tempreture}度 湿度#{@humidity}%"
  end
end
def main
  weatherdata = WeatherData.new
  currentDisplay = CurrentConditionDisplay.new( weatherdata )
  weatherdata.setMeasurements( 27, 65, 30.4 )
  weatherdata.setMeasurements( 28, 70, 29.2 )
  weatherdata.setMeasurements( 26, 90, 29.2 )
end
main
% ./weather.rb 現在の気象状況: 温度27度 湿度65% 現在の気象状況: 温度28度 湿度70% 現在の気象状況: 温度26度 湿度90%
4873112494
[ツッコミを入れる]














