【问题标题】:How can i implement the following typescript code better?我怎样才能更好地实现以下打字稿代码?
【发布时间】: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


【解决方案1】:

在@plalx 评论之后,这是一个示例:

class ResolverFactory {
    private static readonly resolvers: Map<typeof DataRequest, DataResolver> = new Map([
        [FooDataRequest, new FooViewResolver()],
        [BarDataRequest, new BarViewResolver()]
    ]);

    public static getResolver(request: DataRequest): DataResolver {
        let resolver: DataResolver | undefined = ResolverFactory.resolvers.get(request.type);
        if (!resolver) {
            throw new Error(`Resolver for '${String(request.type)}' not found`);
        }
        return resolver;
    }
}

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 2013-09-28
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    相关资源
    最近更新 更多