【发布时间】:2017-06-25 10:08:43
【问题描述】:
我有以下实现请求-响应流程的打字稿代码。
可以有两种类型的 DataRequest - FooDataRequest 和 BarDataRequest 。
这些请求类型有多个解析器。 FooResolver 做 Foo 特定的事情并发回 FooDataResponse 和 BarResolver 做 Bar 特定的事情并发回 BarDataResponse
abstract class DataRequest{
public type: typeof DataRequest;
public payload: string;
}
abstract class DataResponse {
public data: any;
}
class FooDataRequest extends DataRequest {
constructor() {
super();
this.type = FooDataRequest;
this.payload = "foo request";
}
}
class BarDataRequest extends DataRequest {
constructor() {
super();
this.type = FooDataRequest;
this.payload = "foo request";
}
}
class FooDataResponse extends DataResponse {
constructor() {
super();
this.data = "foo response";
}
}
class BarDataResponse extends DataResponse {
constructor() {
super();
this.data = "bar response";
}
}
abstract class DataResolver {
abstract resolve(request:DataRequest): DataResponse
}
class FooViewResolver extends DataResolver {
public resolve(reportRequest:FooDataRequest): FooDataResponse {
return new FooDataResponse();
}
}
class BarViewResolver extends DataResolver {
public resolve(dashboardRequest:BarDataRequest): BarDataResponse {
return new BarDataResponse();
}
}
class ResolverFactory {
public static getResolver(request: DataRequest): DataResolver {
//If there is 100 request , then so many if else statement
//That is not effective
if (request.type === FooDataRequest) {
return new FooViewResolver();
}
else if (request.type = BarDataRequest) {
return new BarViewResolver();
}
}
}
const request :DataRequest = new FooDataRequest();
const resolver: DataResolver = ResolverFactory.getResolver(request);
console.log(resolver);
const response: DataResponse = resolver.resolve(request);
console.log(response);
实现解析器工厂的最佳方法是什么?如果我有 100 种请求类型,那么 if 将有多个 if else 语句来识别合适的解析器。 或者有没有更好的方法来设计这个问题?
【问题讨论】:
-
所以它不是代码审查网站。 :) 还有其他论坛。 :)
-
您可以简单地向工厂注册解析器,并使用内部映射将解析器与请求类型相关联。
标签: typescript design-patterns factory