是否有用于处理未知对象库的设计模式?

时间:2014-03-13 18:20:31

标签: design-patterns

我正在编写REST框架,并且我想实现oauth 2.0。问题是我不希望对运行的数据库有任何限制。

所以我考虑实现这个的方法是让开发人员实现他们自己的DataStore类,它实现了我与之交互的方法。我在Python工作,所以没有办法像在java中那样定义接口,但是我创建了一个基类,它只是为任何方法调用引发NotImplemented,开发人员应该将其子类化

对于我的情况,Datastore对象将有如下方法:

class DataStore(object):
    def store_client(client_id, client_secret, client_urls):
        ...

    def get_client(client_id, client_secret)
        ...

    def store_token(client_id, token):
        ...

....

开发人员将使用他们选择的数据存储方法实现这些方法,尽管我会为常见数据库提供一些实现。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

我会说这是一种替代方案,可能会或可能不会“更好”或更适合您的需求。您在示例中显示的是传统的DAO或数据存储类型模式。其中对象模型公开了执行所有CRUD操作的方法:读取,更新,创建和删除。这样做的缺点是,在查询或查询数据本身时需要更多逻辑,一个简单的3-4类暴露方法可以扩展到20多种方法。

这是您开始考虑每个单独行为是不同的独立身份的地方。因此,您可能拥有一个具有简单界面的“Accessor”对象,如:

 class GetClient(object):
   def get(self, client_id):
     pass

但主题有几种不同的变体,如:

 class AuthenticatedGetClient(GetClient):
   def __init__(self, authorization_service, current_user):
     #stuff
   def get(self, client_id):
     if self.auth_svc.permit(self.current_user, client_id):
       #actual client get, perhaps you need to screen out additional details, etc.

这更多地遵循CQRS方法,其中您对View表示的模型实际上可能不同,或者将多个DB模型合并在一起。示例:用户模型可以存储user_name,而地址存储地址,并且数据库中确实不存在“配置文件”模型。

这样做的好处是,您可以混合使用更复杂的访问模式,同时抽象出数据存储区并减少呈现给任何其他开发人员的不同API调用的数量。缺点是您需要为每个CRUD操作创建不同的对象表示。