【发布时间】:2018-07-04 01:21:47
【问题描述】:
我有一个简化的设计如下(基本上是一堆处理程序来处理 2 种不同类型的请求:EventRequest 和 SpeechRequest)。下面是伪代码:
class SpeechRequest {sessionId: String; slot: String}
class EventRequest {sessionId: String; event: String}
class SpeechRequestHandler;
class EventRequestHandler;
class SpeechRequestHandler[A/B/C] extends SpeechRequestHandler {
- handle(request: SpeechRequest) {
doSt(request.slot)
}
}
class EventRequestHandler[A/B/C] extends EventRequestHandler {
- handle(request: EventRequest) {
doSt(request.event)
}
}
有2个不同的dispatcher为每种类型的请求找到合适的handler,然后转发给handler去处理:
class SpeechDispatcher {
- handle(request: SpeechRequest) {
handler: SpeechRequestHandler = findHandlerToHandle(request);
handler.handle(request);
}
}
class EventDispatcher {
- handle(request: EventRequest) {
handler: EventRequestHandler = findHandlerToHandle(request);
handler.handle(request);
}
}
现在,我想重构并创建一个基类/通用类。当然,我想出了这个:
class Request {sessionId: String}
class SpeechRequest extends Request {slot: String}
class EventRequest extends Request {event: String}
class RequestHandler {
- canHandleRequest(Request): bool
- handle(Request)
}
class SpeechRequestHandler extends RequestHandler {
- canHandleRequest(request: Request): bool = request instanceof SpeechRequest
}
class EventRequestHandler extends RequestHandler {
- canHandleRequest(request: Request): bool = request instanceof EventRequest
}
class SpeechRequestHandler[A/B/C] extends SpeechRequestHandler {
- handle(Request: request) {
//need to cast to specific type to extract a certain fields to do some operation
//!! I feel something is not right because of that
speechRequest:SpeechRequest = (SpeechRequest)request;
doSt(speechRequest.slot)
//other operation can work with base Request object; so it's OK
}
}
class EventRequestHandler[A/B/C] extends EventRequestHandler {
- handle(Request: request) {
eventRequest:EventRequest = (EventRequest)request;
doSt(eventRequest.event)
//other operation can work with base Request object; so it's OK
}
}
对于所有 SpeechRequestHandler[A/B/C]:handle 函数,我现在需要将 Request 对象转换为 (SpeechRequest) 对象:speechRequest:SpeechRequest = (SpeechRequest)request;
我觉得我的设计有缺陷。如果每个 SpeechRequestHandler 我都需要将对象转换为 (SpeechRequest) 以便我可以对这些信息做一些事情,这是否意味着在这种情况下重构基类没有意义?
请您建议一种更好的方法或设计模式来干净地处理这个问题。
谢谢。
【问题讨论】:
-
您可能需要标记正确的语言。
-
-
您能否使用在
RequestHandler上定义的泛型来限制实现中预期事件的类型? -
@MadProgramer:不,我不想使用泛型,因为我的处理程序是由 spring bean 初始化的,并且它不能很好地与泛型一起使用。此外,它将增加额外的复杂性。我只是想知道将类转换为上述特定类型是否正常?
标签: java oop design-patterns class-design