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)
但我真的不确定,如果这是"红宝石的方式".
欢迎提供帮助,建议和建议.最好,菲尔
战略模式可以在这里应用
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)
模块通常用于排除多个对象的共同行为。我相信在这种情况下你所需要的只是鸭子类型。只需contacts在 Java 解决方案中共享接口的所有类中实现方法即可。
请注意,此解决方案允许您将不同类型的对象保留在单个集合中,当您迭代它们时(或以任何其他方式您想要使用这些公共接口对象),您只需调用此方法contacts,而不关心什么他们确实是这样的类型。
如果您需要在实现此接口的所有类中实现一些通用行为,您可以创建基于contacts方法存在的模块,并将其包含在可以使用它的所有类中。