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

重用Java中现有接口实现的设计模式

沈伟
2023-03-14

假设我有一个接口

    public interface Action<T> {
        void doWork(T t);
    //can have multiple methods
    }

现在该类由

    public class DefaultAction implements Action<String> {
        @Override
        public void doWork(String s) {
            System.out.println(s);
        }
    }

现在我有一个接受动作的流

public abstract class Flow<T> {

    void execute(T t){
        Action<T> action = getAction();
        action.doWork(t);
    }

    abstract Action<T> getAction();
}

所以我有一个流接受双倍

public class AnotherActionFlow extends Flow<Double> {

    @Override
    Action<Double> getAction() {
        return new AnotherActionSet();
    }
}

然后使用默认操作

public class AnotherActionSet implements Action<Double> {

    DefaultAction defaultAction;

    @Override
    public void doWork(Double aDouble) {
        defaultAction.doWork(String.valueOf(aDouble));
    }
}

因此,在这种情况下,每当操作接口发生更改时,我必须始终更新AnotherActionAssite方法

它们是否有任何变通方法,以便我可以使用公共逻辑将double转换为字符串,然后使用defaultaction

是否有任何模式可以帮助将AnotherActions转换为DefaultAction,其中我只指定String.ValueOf(aDouble),以便将值传递给DefaultAction,而不是为每个方法编写相同的内容

我希望将DefaultAction中的逻辑重用到其他操作,这些操作是DefaultAction的包装器

为...;

public class AnotherActionSet2 implements Action<Long> {

    DefaultAction defaultAction;

    @Override
    public void doWork(Long long) {
        defaultAction.doWork(String.valueOf(long));
    }
}


public class AnotherActionSet3 implements Action<Integer> {

    DefaultAction defaultAction;

    @Override
    public void doWork(Integer int) {
        defaultAction.doWork(String.valueOf(int));
    }
}


正如您所看到的,我每次都必须手动编写映射,而不是仅仅传递将give类转换为string的函数,然后我就可以使用defaultaction

所以我只需要定义函数 dToS并将其插入 defaultaction中,而不需要再次定义方法

共有1个答案

钱毅
2023-03-14

你可以使用Java 8 lambda获得更容易和更有表现力的东西。

基本上,您的操作与来自JDK的标准使用者相同,只是方法的名称发生了变化。

则defaultAction如下所示:

Consumer<String> defaultAction = s -> {System.out.println(s);}

所以AnotherActionSet可以这样表达:

Consumer<Double> anotherActionSet = s -> {defaultAction.accept(String.valueOf(aDouble));}

您还发现flow和action的操作完全相同(做一个T,什么也不返回),因此其中一个概念是多余的。你可以这样写:

Consumer<Double> anotherActionFlow = anotherActionSet;
 类似资料:
  • 本文向大家介绍设计模式构建器模式/Java 实现,包括了设计模式构建器模式/Java 实现的使用技巧和注意事项,需要的朋友参考一下 示例 通过Builder模式,您可以以易于阅读的方式创建具有许多可选变量的类的实例。 考虑以下代码: 如果所有参数都是必需的,那么一切都很好。如果有更多的变量和/或其中一些是可选的怎么办?您不想使用必需参数和可选参数的每种可能的组合来创建大量的构造函数,因为它变得难以

  • 问题内容: 有没有为接口方法创建默认实现的首选方法或样式?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。 我的第一个直觉是用静态方法创建一个具体的类。然后,当我想要默认功能时,可以将功能委托给静态方法。 这是一个简单的示例: 接口 方法的具体实现 使用默认功能的具体实现 这里有更好的方法吗? 编辑 在看到了一些建议的解决方案之后,我认为我应该更加清楚自己的意图。本质上,我正在尝试

  • 问题内容: 这是关于管道实施的设计问题。以下是我的幼稚实现。 管道中各个步骤/阶段的接口: 管道中的步骤/阶段的具体实现: 管道类将保存/注册管道中的步骤,并一个接一个地执行它们: Diver程序执行管道: 但是,您可以看到,幼稚的实现有很多限制。 主要要求之一是,由于要求每个步骤的输出可以是任何类型,因此朴素的实现不是类型安全的(Pipeline类中的execute方法)。如果我碰巧错误地连接了

  • 有人可以通过添加到我已经编码的内容来帮助我设计解决方案吗?或者向我指出一个已经存在的模式来解决这个问题?

  • 问题内容: 我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。 例如: 在操场上:https : //play.golang.org/p/B1GgoNToNl_l 在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误 dog.WagTail未定义(动物类型没有字段或方法WagTail)。 有没有一种

  • 本文向大家介绍Java接口统一样式返回模板的实现,包括了Java接口统一样式返回模板的实现的使用技巧和注意事项,需要的朋友参考一下 前言 一开始,我们在写项目的时候,前端要什么数据,我们就返回什么数据,每个接口也都写得不一样很乱;随着前后端的分离;对于代码规范的要求也越来越严谨;接口都是统一样式的返回模板; 下面,接受一种我之前用过的返回模板; 一、首先来看下我们的Controller接口 我们可