RubyでStrategyパターン
Javaでいうインターフェイスの代わりに基底クラスを使うって正しいのでしょうか?以下の例でいうとEncryptクラスの部分です。
抽象メソッドが定義できないようなので、基底クラスにメソッドを用意しても
下位クラスが実装するかどうかは保証できません。これではあまり意味はないような気がしています。なんかいい方法がありそうなんだけどなー。もしかすると、動かしてみればわかるっていう世界なのかも!
class SecretMailSender attr_writer :encrypt def send(toAddress, message) # encrypt message encryptMessage = @encrypt.encode(message) # send message print "to : #{toAddress}?n" print "message : #{encryptMessage}?n" print "encrypt class : #{@encrypt.class.to_s}?n?n" end end class Encrypt def encode(str) end end class NullEncrypt<Encrypt def encode(str) return str end end class ReverseEncrypt<Encrypt def encode(str) return str.reverse end end class RandomCryptEncrypt<Encrypt def encode(str) salt = [rand(64),rand(64)].pack("C*").tr("?x00-?x3f","A-Za-z0-9./") return str.crypt(salt) end end # MAIN sender = SecretMailSender.new toAddress = "info@mobster.jp" message = "Mobster Party 5th Information!" # NullEncrypt sender.encrypt = NullEncrypt.new sender.send(toAddress, message) # ReverseEncrypt sender.encrypt = ReverseEncrypt.new sender.send(toAddress, message) # RandomCryptEncript sender.encrypt = RandomCryptEncrypt.new sender.send(toAddress, message)
実行結果
to : info@mobster.jp message : Mobster Party 5th Information! encrypt class : NullEncrypt to : info@mobster.jp message : !noitamrofnI ht5 ytraP retsboM encrypt class : ReverseEncrypt to : info@mobster.jp OGNniChoKFg encrypt class : RandomCryptEncrypt