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
[ツッコミを入れる]









