首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过JSON配置选择策略

通过JSON配置选择策略
EN

Stack Overflow用户
提问于 2016-09-14 17:55:56
回答 1查看 243关注 0票数 4

我正在用Java/Kotlin实现一个学习代理。此代理的部分功能包括搜索大量可能的选项。有多种搜索可能性空间的好方法,我经常改变主意,决定哪一个是最好的。因此,我决定将其作为一个策略模式来实现。

代码语言:javascript
复制
class Agent(val searchStrategy : SearchStrategy){
    fun search(input : InputGraph) : Result{
        return searchStrategy.search()
    }
}

interface SearchStrategy{
    fun search(input : InputGraph) : Result
}

class FastSearch : SearchStrategy{
    //implementation here
}

class AccurateSearch : SearchStrategy{
   // implementation here
}

class ExperimentalSerach : SearchStrategy{
  // implentation here
}

最近,我决定运行一个大型的实验套件,以测试各种系统参数的有效性。这是通过一个python脚本完成的,该脚本通过使用不同的config.json文件作为参数运行编译后的jar来启动每个实验。类似于:

代码语言:javascript
复制
{
    "numSamples" : 5000,
    "environmentDifficulty" : 3,
    "hazardProbability" : 0.4,
    //etc..
}

现在,我想让实验者也能够配置代理使用的策略。做这件事最好的方法是什么?我的第一个想法是,我可以只向config.json添加一个额外的字符串字段:

代码语言:javascript
复制
{
    "numSamples" : 5000,
    "environmentDifficulty" : 3,
    "hazardProbability" : 0.4,
    "agentStrategy": "FastSearch"
}

然后在主系统中使用when或if分支构建它:

代码语言:javascript
复制
val searchStrategy = when(config.agentStrategy){
    "FastSearch" -> FastSearch()
    "AccurateSearch" -> AccurateSearch()
    "ExperimentalSearch" -> ExperimentalSearch()
val agent = agent(searchStrategy)

但是,如果我开始添加更多的策略,这似乎会开始变得尴尬/难以维护。有没有更好的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-14 18:07:33

解决这个问题的一种方法是使用类名来加载并创建策略的实例,如下所示:

代码语言:javascript
复制
val agentClass = classLoader.loadClass(config.agentStrategy)!!
val agent = agentClass.newInstance() as SearchStrategy

另一种方法是注册所有搜索策略,然后使用给定的config进行匹配,如下所示:

代码语言:javascript
复制
class SearchStrategies(val strategies: List<SearchStrategy>){
    fun findForConfig(config:Config) = strategies.find { it.javaClass.name.contains(config.agentStrategy) }
}


//somewhere at boot time
val searchStrategies = SearchStrategies(listOf(FastSearch(), AccurateSearch()))


//when needed
val config = ...
val agent = searchStrategies.findForConfig(config)

最后,还可以利用SPI来实现更大的可扩展性和标准遵从性,但代价是复杂性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39487535

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档