如何更好地实现以下typescript代码?
我有以下实现请求-响应流的typescript代码 数据请求可以有两种类型-FooDataRequest和BarDataRequest 这些请求类型有多个解析程序。FooResolver执行Foo特定的操作并发送回FooDataResponse和BarResolver,后者执行Bar特定的操作并发送回BarDataResponse如何更好地实现以下typescript代码?,typescript,design-patterns,factory,Typescript,Design Patterns,Factory,我有以下实现请求-响应流的typescript代码 数据请求可以有两种类型-FooDataRequest和BarDataRequest 这些请求类型有多个解析程序。FooResolver执行Foo特定的操作并发送回FooDataResponse和BarResolver,后者执行Bar特定的操作并发送回BarDataResponse abstract class DataRequest{ public type: typeof DataRequest; public payload
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语句来标识适当的解析器。
还是有更好的方法来设计这个问题?下面是@plalx注释,下面是一个示例:
类解析工厂{
专用静态只读解析器:Map=newmap([
[FooDataRequest,新的FooViewResolver()],
[BarDataRequest,新的BarViewResolver()]
]);
公共静态getResolver(请求:DataRequest):DataResolver{
let resolver:DataResolver | undefined=ResolverFactory.resolvers.get(request.type);
if(!解析器){
抛出新错误('Resolver for'${String(request.type)}'未找到');
}
返回解析器;
}
}
所以它不是一个代码审查网站。:)还有其他论坛可供选择。:)您可以简单地针对工厂注册冲突解决程序,并使用内部映射将冲突解决程序链接到请求类型。