红宝石中的界面式设计模式

dc1*_*c10 8 ruby design-patterns

我正在寻求有关设计模式的帮助.我非常习惯java中的接口,我不知道如何在ruby中获得类似的机制.它需要的是一种具有接触方法的接口.为了获得联系我需要打电话给api,这可能是google,linkedid或任何web服务.所以我想使用一个界面,它为我提供了联系方式,我不想知道任何关于提供者的信息.

我的第一次尝试看起来像这样(伪代码):

Module AbstractContact
 def contacts
  #do some stuff with @data
  @data
 end
end

class Impl
  include AbstractContact
 def build_provider(provider)
  if provider == :google
   #get the data from google
    gdata= api_call
   @data = gdata
   elsif provider == :linkedin
   end
 end
end


c=Impl.new
c.build_provider

c.contacts
Run Code Online (Sandbox Code Playgroud)

但我真的不确定,如果这是"红宝石的方式".

欢迎提供帮助,建议和建议.最好,菲尔

Hoa*_*Hoa 6

战略模式可以在这里应用

def Provider
  def contacts
    raise "Abstract method called"
  end
end

class Google < Provider
  def contacts
    data = # Google API call
  end
end

class LinkedIn < Provider
  def contacts
    data = # LinkedIn API call
  end
end

class Impl
  def initialize(provider)
    case provider
    when :google
      @provider = Google.new
    when :linkedin
      @provider = LinkedIn.new
    else
      raise "Unknown provider"
    end
  end

  def contacts
    @provider.contacts
  end
end

impl = Impl.new(provider)
impl.contacts
Run Code Online (Sandbox Code Playgroud)


sam*_*uil 2

模块通常用于排除多个对象的共同行为。我相信在这种情况下你所需要的只是鸭子类型。只需contacts在 Java 解决方案中共享接口的所有类中实现方法即可。

请注意,此解决方案允许您将不同类型的对象保留在单个集合中,当您迭代它们时(或以任何其他方式您想要使用这些公共接口对象),您只需调用此方法contacts,而不关心什么他们确实是这样的类型。

如果您需要在实现此接口的所有类中实现一些通用行为,您可以创建基于contacts方法存在的模块,并将其包含在可以使用它的所有类中。