Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何更好地实现以下typescript代码?_Typescript_Design Patterns_Factory - Fatal编程技术网

如何更好地实现以下typescript代码?

如何更好地实现以下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

我有以下实现请求-响应流的typescript代码

数据请求可以有两种类型-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语句来标识适当的解析器。
还是有更好的方法来设计这个问题?

下面是@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)}'未找到');
}
返回解析器;
}
}

所以它不是一个代码审查网站。:)还有其他论坛可供选择。:)您可以简单地针对工厂注册冲突解决程序,并使用内部映射将冲突解决程序链接到请求类型。