我在使用策略模式时遇到了一个问题.我正在实现创建任务的服务.此服务还解决了此任务的负责人员.解决职员是通过使用策略模式来完成的,因为有不同的方法可以做到这一点.关键是每个策略都需要不同的参数来解决职员.
例如:
interface ClerkResolver {
String resolveClerk(String department);
}
class DefaultClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// some stuff
}
}
class CountryClerkResolver implements ClerkResolver {
public String resolveClerk(String department) {
// I do not need the department name here. What I need is the country.
}
}
Run Code Online (Sandbox Code Playgroud)
问题是每个解析器可能依赖于不同的参数来解决负责的职员.对我来说,这听起来像是我的代码中的设计问题.我还尝试将一个类作为参数来保留策略可能需要的所有值,例如:
class StrategyParameter {
private String department;
private String country;
public String getDepartment() ...
}
interface ClerkResolver {
String resolveClerk(StrategyParameter strategyParameter);
}
Run Code Online (Sandbox Code Playgroud)
但说实话,我对这个解决方案并不满意,因为每当策略需要一个新的/不同的参数时我就必须更改参数类.其次,策略的调用者必须设置所有参数,因为他不知道哪个策略将解析职员,因此他必须提供所有参数(但这并不是那么糟糕).
同样,对我而言,这听起来像我的代码中的设计问题,但我找不到更好的解决方案.
---编辑
此解决方案的主要问题是创建任务时.任务服务如下所示:
class TaskService { …Run Code Online (Sandbox Code Playgroud) 在开发过程中,我们使用的是未缩小的javascript和CSS文件.但是,当生产战争建立时,它们必须缩小(使用yuicompressor).所以,我想用缩小的文件替换原始的javascript和CSS文件.项目结构如下(没什么特别的):
+ webapp
|-- js
|-- css
...
Run Code Online (Sandbox Code Playgroud)
我想要做的是:在Gradle创建WAR之前,我想用yuicompressor缩小上面提到的文件,并希望它们被打包在WAR中.
到目前为止我所做的是在创建WAR之前运行一个任务,这会缩小文件:
war {
it.dependsOn minifyJavaScript
}
Run Code Online (Sandbox Code Playgroud)
minifyJavaScript任务获取webapp/js文件夹中的所有文件,缩小它们并将它们存储在$ {buildDir}/js目录中.我唯一无法工作的是这些文件被打包到WAR中.我试着调整sourceSets,但是我从Gradle得到了一个错误:
apply plugin: 'java'
...
sourceSets {
main {
webapp {
srcDir "${buildDir}/js"
}
}
}
Run Code Online (Sandbox Code Playgroud)
错误:找不到支持的Gradle DSL方法:'sourceSets()'
我还尝试将文件包含在:
war {
it.dependsOn minifyJavaScript
include ${buildDir}/js
}
Run Code Online (Sandbox Code Playgroud)
此解决方案的问题是WAR仅包含缩小的文件.
那么,有没有办法告诉Gradle在WAR创建过程中添加$ {buildDir}/js路径?或者是否有更好/更简单的方法来包含缩小的文件?
我试图理解,在状态转换期间操作引发的异常是如何可能的。我配置了这个简单的状态机:
transitions
.withExternal()
.source(State.A1)
.target(State.A2)
.event(Event.E1)
.action(executeAnActionThrowingAnException())
Run Code Online (Sandbox Code Playgroud)
在我的服务类中,我注入了我的状态机并发送了这个事件 E1:
@Service
public class MyService() {
@Autowired
private StateMachine<State, Event> stateMachine;
public void executeMyLogic() {
stateMachine.start()
stateMachine.sendEvent(Event.E1);
// how to get thrown exception here
}
}
Run Code Online (Sandbox Code Playgroud)
在我的服务中,我只想知道我的状态机是否以及为什么无法到达 State.A2。因为抛出的异常是由 Spring 状态机获取的,所以我在发送事件后无法得到任何响应。但是状态机没有任何错误,这意味着
stateMachine.hasStateMachineError()
Run Code Online (Sandbox Code Playgroud)
将返回假。那么,我怎样才能在我的服务中获取信息,出现问题,更重要的是什么?
我很感激你的帮助。
此致