当前位置: 首页 > 知识库问答 >
问题:

Sudo策略模式的缺陷

岳安福
2023-03-14

我正在做一个项目,需要调用许多不同的服务,并希望尽可能多地抽象出公共逻辑。问题是我还想返回自定义对象,而不是像JSON这样的东西。当我设计了一种这样做的方法时,我得到了一个范例,它让我想起了一个策略模式,但我认为它不太合适。我想知道在我做这件事的过程中是否有任何设计缺陷或危险。

基本上,我已经创建了一个抽象类(serviceCall),它包含调用服务的公共逻辑(拥有一个internet客户机并从所需服务获得json响应)。这都是通过公共方法调用(map params,map headers) 来完成的。抽象类还定义了两个抽象方法:createCustomDTo(Map params,Map headers) parseresponsetoObject(String json)。我会在一秒钟内解释这些的目的。

将使用扩展ServiceCall并创建抽象方法实现的类创建对不同服务的每次调用。createCustomDTo将创建一个自定义对象,该对象包含调用服务所需的所有信息(url和头)。parseresponsetoobject将接受一个json响应,并将其转换为我稍后要在代码中使用的Java对象。

下面是我所做的一个简单实现

服务所有

public abstract class ServiceCall {

    protected abstract Object parseResponseToObject(String json);

    protected abstract CustomServiceDTO createDTO(Map<String, String> keys,
        Map<String, String> headers);

    public Object call(Map<String, String> params, Map<String, String> headers) {

        // create and configure a CustomServiceDTO to call services with
        CustomServiceDTO dto = createDTO(params, headers);

        try {
            // make the service request
            String json = getServiceResponse(dto);
        catch (Exception e) {
            return new CustomServiceError(e);
        }

        // parse the response into the desired java object
        Object response = parseResponseToObject(json);
        return response;
    }

    private String getServiceResponse(CustomServiceDTO dto) {
        // use common logic to call the service using the information provided
        // by the dto

        String dummyResponse = "{\"prop\":\"value\"}";
        return dummyResponse;
    }
}

采样实现

    public class AddressCall extends ServiceCall {

    @Override
    protected Object parseResponseToObject(String json) {
        return new Address(json);
    }

    @Override
    protected CustomServiceDTO createDTO(Map<String, String> keys, 
        Map<String, String> headers) {
        CustomServiceDTO dto = new CustomServiceDTO();
        dto.setUrl("www.getMyDummyAddress.com/" + keys.get(0) + "=" + keys.get(1));
        dto.setHeaders(headers);
        return dto;
    }
}

我看到的主要缺点是从来不直接调用createCustomdToparseresponsetoObject有点奇怪。

对我来说,它的主要优点是易于使用,并且可以将我的响应作为Java对象返回。

我真正想知道的是,这种范式还有其他的顾虑或弊端吗?它在代码中很好,但我承认它似乎有点不同于Java的正常使用方式。

共有1个答案

田信然
2023-03-14

这与通常使用Java的方式没有什么不同,这被称为模板方法设计模式

除了Object的使用外,它很常见,最好用泛型类型代替。

 类似资料:
  • 主要内容:介绍,实现,Strategy.java,OperationAdd.java,OperationSubtract.java,OperationMultiply.java,Context.java,StrategyPatternDemo.java在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 contex

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...

  • 问题 解决问题的方式有多种,但是你需要在程序运行时选择(或是转换)这些方法。 解决方案 在策略对象(Strategy objects)中封装你的算法。 例如,给定一个未排序的列表,我们可以在不同情况下改变排序算法。 基类 StringSorter = (algorithm) -> sort: (list) -> algorithm list 策略 bubbleSort = (list) -

  • 应用场景 一个商场收银软件,营业员根据客户所购买的商品的单价和数量,向客户收费 用两个文本框来输入单价和数量,一个确定按钮来算出每种商品的费用,用个列表框来记录商品的清单,一个标签来记录总计,一个重置按钮来重新开始。 double total = 0.0d; private void btn0k_Click(object sender, EventArgs e) { double

  • 在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 context 对象的执行算法。 介绍 意图:定义一系列的算法,把它们一个个封装起来, 并且使它们可相互替换。 主要解决:在有多种算法相似的情况下,使用 if...

  • 策略模式 策略模式就是用统一的方法接口分别对不同类型的数据进行访问。比如说,现在我们想用pc看一部电影,此时应该怎么做呢?看电影嘛,当然需要各种播放电影的方法。rmvb要rmvb格式的方法,avi要avi的方法,mpeg要mpeg的方法。可是事实上,我们完全可以不去管是什么文件格式。因为播放器对所有的操作进行了抽象,不同的文件会自动调用相应的访问方法。 typedef struct _MovieP