我遇到了一个设计问题,我有不同的实现来保存数据和处理不同工具的其他事情。我使用了一个工厂的设计来保存数据,并从数据库中获取数据。
class SaveDataService {
public void saveData(Data data) {
}
public List<Tool> getTools() {
return List.of();
}
}
class FishToolSaveDataService extends SaveDataService {
@Override
public void saveData(Data data) {
}
@Override
public List<Tool> getTools() {
return List.of(Tool.FISH);
}
}
class DogSaveDataService extends SaveDataService {
@Override
public void saveData(Data data) {
}
@Override
public List<Tool> getTools() {
return List.of(Tool.DOG);
}
}
class Data {
JsonNode data;
int version;
}
enum Tool {
FISH,
DOG
}
因此,My FactoryMap器基于枚举工具
现在我有一个版本的每个工具,以维持,但保存实现的变化,为每个版本。如何在不使用if else检查的情况下维护saveData(Data数据)方法实现。
我尝试了简单的if/else检查saveData方法的版本,但如果我有五个不同的版本,并且两个不同的工具具有相同的保存不同版本的逻辑,则会延长很长时间。这是复制我的代码。
我如何设计这个版本,以便我可以重用我的代码?
我总共有15个工具实现,我从3个工具中的第2个版本开始,但在未来,更多的版本和更多的工具将到来。
1条答案
按热度按时间mjqavswn1#
问题陈述似乎能够创建类,这些类可以保存不同Tool类型和版本组合的逻辑。这是一个复杂的问题陈述,只能通过一个例子来回答。
首先创建一个接口来表示保存特定版本的逻辑:
为不同的版本定义一些具体的/通用的逻辑。
现在,您可能需要根据非通用工具类型执行特定逻辑。为此,您可以创建更专门的子类,例如下面的子类:
我们现在创建一个
VersionDataServiceFactory
来保存一个map。此Map将包含用于不同排列/组合的预先创建的VersionDataService
对象。(见最后的例子,稍后会更有意义)现在让我们把所有这些放在一起:
注意
alpha
对象是如何在Fish和Dog alpha版本中重用的。这就实现了在不使用if-else的情况下为不同的工具类型重用代码的目标。还要注意,当调用saveDataService.save(data);
时,它会自动为给定的Tool类型和版本组合获取正确的VersionDataService
实现。注意:这是一个稍微复杂的设计问题。该代码尚未经过测试,但仅指示可以遵循的方法。还有更多的改进可以做,例如使用
Decorator
模式,以避免为每个版本+工具组合创建太多的子类,或者使用AbstractFactory
模式,或者定义一个名为VersionDataKey
的类来表示工厂Map的键等等;但这些方面是故意留给读者(包括你)去发现的,因为涵盖这些方面会使这个答案太长。