Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 是否有用于处理未知对象存储的设计模式?_Design Patterns - Fatal编程技术网

Design patterns 是否有用于处理未知对象存储的设计模式?

Design patterns 是否有用于处理未知对象存储的设计模式?,design-patterns,Design Patterns,我正在编写一个REST框架,我想实现OAuth2.0。问题是,我不希望对运行此操作的数据库有任何限制 所以我考虑实现它的方式是让开发人员实现他们自己的数据存储类,它实现了我可以与之交互的方法。我在Python中工作,所以没有办法像java中那样定义接口,但我正在创建一个基类,它只为任何方法调用引发NotImplemented,开发人员应该将其子类化 对于我的情况,数据存储对象将具有如下方法: class DataStore(object): def store_client(client

我正在编写一个REST框架,我想实现OAuth2.0。问题是,我不希望对运行此操作的数据库有任何限制

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

对于我的情况,数据存储对象将具有如下方法:

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):
        ...

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


有更好的方法吗?

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

这就是你开始思考每个单独的行为是一个不同的、独立的身份。因此,您可能有一个具有简单接口的“访问器”对象,如:

 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.
这更多地遵循了一种方法,即您向视图表示的模型实际上可能是不同的,或者是几个DB模型的合并。示例:用户模型可能存储用户名,而地址存储地址,并且数据库中实际上不存在“配置文件”模型


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

没有“更好”的方法,有其他方法,但仅此而已。每个人都有自己的权衡。我有兴趣在答案中了解更多关于这些备选方案的信息。