我需要实现可能是一个物理表或逻辑数据源上CRUD操作(内存中缓存保留查询多个表后的数据)。为数据源的理想选择是在数据库表。但由于一些原因,有替代实现其内存缓存类模拟理想的实现。
interface IEmp
{
Add();
Update();
Remove();
}
有2个实现:
操作上在sqlite的物理表
运行内存缓存 - 从多个其他表的汇总数据
基于性能或其他非功能性需求类的消费者可以选择切换到的任2个选项。
我想申请这里的设计模式,这样不会造成太大的返工。
我看到2种设计模式在这里适用:
一种。 Strategy模式 -
会有2个单独的接口IEMP(如上述)的实施方式。例如
Class EmpTable
{
IEmp table;
bool isInMemory;
}
基于isInMemory T / F table
将底层的实例切换至上述实施1 {Emp
或EmpCache
}
湾装饰图案 - 另一个接口扩展+封装IEMP接口。而基于属性的变化 - 它会在ACT /委托作为适当例如
IEmpCache : IEmp
{
IEmp instance;
bool useCache;
}
EmpCache : IEmpCache
{
Add()
{
if(!useCache)
{
instance.Add();
}
//cache logic
}
... // same for all other methods
}
我看到B方法更好,但需要添加/增强已经发布的功能(类/接口)时,大多采用的,不是吗?
哪个更好?有没有其他更好的模式?
当然选择B是更好的。
如果我们先来看看下面的模式是如何分类。装饰器是一种结构模式和战略是一种行为模式。
Decorator是一个结构性的设计模式,可以让你通过将这些对象中包含的行为特别包装对象附加新的行为对象。
根据你的问题,你想新的行为添加到现有的对象。装饰的定义是,就像你描述你的问题。 Cache是要添加新的行为。我有一个类似的问题,用它和它通常工作得很好。它与你不能或新功能,可能有一天会需要缓存改变类效果很好。
Strategy是一种行为设计模式,可以让你定义一个家庭的算法,把他们每个人到一个单独的类,并让它们的对象互换。
我没有用的策略来缓存数据。根据定义,我认为它有不同的目的。它可以是很难与已经发布类来实现。该战略有许多用例,例如,当你做一些计算方法,可能会改变它可以更好。
与数据库的工作时,我已经使用了策略模式,但它是我想要的地方支持许多不同的复杂查询的情况。这样一来,我可以实现与战略格局的查询和传递战略,以反对该句柄数据库连接。