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