双重用途类的设计模式(内存缓存或表)
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 是一种行为设计模式,可让您定义一系列算法,将它们放入一个单独的类中,并使它们的对象可互换。
我没有使用策略来缓存数据。根据定义,我认为它有不同的目的。使用已经发布的类可能更难实现。该策略有许多用例,例如,当您进行一些可能会改变的计算时,它会更好。
我在处理数据库时使用了策略模式,但在这种情况下,我想支持许多不同的复杂查询。这样,我就可以使用策略模式实现查询,并将该策略传递给处理数据库连接的对象。
【讨论】:
以上是关于双重用途类的设计模式(内存缓存或表)的主要内容,如果未能解决你的问题,请参考以下文章