双重用途类的设计模式(内存缓存或表)

Posted

技术标签:

【中文标题】双重用途类的设计模式(内存缓存或表)【英文标题】:Design Pattern for dual purpose class (in-memory cache or table) 【发布时间】:2017-07-14 03:18:53 【问题描述】:

我需要对可能是物理表或逻辑的数据源实施 CRUD 操作(内存缓存在查询多个表后保存数据)。数据源的理想选择是数据库中的表。但是由于某些原因,内存中缓存类的替代实现可以模仿理想的实现。

interface IEmp

      Add();
      Update();
      Remove();

有两种实现方式:

    类雇员

在sqlite中对物理表进行操作

    类 EmpCache

操作内存缓存 - 聚合来自多个其他表的数据

基于性能或其他非功能性需求,类消费者可以选择切换到 2 个选项中的任何一个。

我正在考虑在这里应用设计模式,以免造成太多返工。

我在这里看到了 2 种适用的设计模式:

一个。策略模式 -

IEmp 接口将有 2 个单独的实现(如上)。 例如

Class EmpTable

     IEmp table;
     bool isInMemory;

基于 isInMemory T/F table 将底层实例切换到上述实现的 1 Emp or EmpCache

b.装饰器模式 - 另一个接口扩展+封装IEmp接口。并基于属性变化 - 它将酌情采取行动/委托 例如

IEmpCache : IEmp

     IEmp instance;
     bool useCache;

EmpCache : IEmpCache

     Add()
     
         if(!useCache)
         
             instance.Add();
         
         //cache logic
     
     ... // same for all other methods

我认为 b 方法更好,但主要用于需要添加/增强已发布的功能(类/接口)时,不是吗?

哪个更好?还有其他更好的模式吗?

【问题讨论】:

你和哪一个一起去的? 【参考方案1】:

当然选择 B 更好。

如果我们先看看以下模式是如何分类的。装饰器是一种结构模式,策略是一种行为模式。

Decorator 是一种结构设计模式,通过将这些对象放置在包含行为的特殊包装对象中,您可以将新行为附加到对象。

根据您的问题,您希望向现有对象添加新行为。装饰器的定义就像你描述你的问题一样。缓存是您要添加的新行为。我在类似的问题中使用过它,它通常效果很好。它适用于您无法更改的类或将来可能需要缓存的新功能。

Strategy 是一种行为设计模式,可让您定义一系列算法,将它们放入一个单独的类中,并使它们的对象可互换。

我没有使用策略来缓存数据。根据定义,我认为它有不同的目的。使用已经发布的类可能更难实现。该策略有许多用例,例如,当您进行一些可能会改变的计算时,它会更好。

我在处理数据库时使用了策略模式,但在这种情况下,我想支持许多不同的复杂查询。这样,我就可以使用策略模式实现查询,并将该策略传递给处理数据库连接的对象。

【讨论】:

以上是关于双重用途类的设计模式(内存缓存或表)的主要内容,如果未能解决你的问题,请参考以下文章

squid的三种模式

单例模式和双重检测的小结

单例模式和双重检测的小结

单例模式双重锁为什么要volitie修饰:

单例设计模式

设计模式之单例模式实践