簡體   English   中英

重用 java 中現有接口實現的設計模式

[英]Design pattern to reuse the existing interface implementation in java

假設我有一個接口

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

現在這個 class 由

    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));
    }
}

所以在這種情況下,每當操作界面發生變化時,我必須始終更新AnotherActionSet方法

他們是否有任何解決方法,以便我可以使用通用邏輯將雙精度轉換為字符串,然后使用DefaultAction

任何模式都可以幫助將AnotherActionSet轉換為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));
    }
}


如您所見,我每次都必須手動編寫映射,而是可以只通過 function 將給定 class 轉換為字符串,然后我可以使用DefaultAction

所以我只定義 Function<Double,String> dToS 並將其插入DefaultAction並且不需要再次定義該方法

您可以使用 Java 8 lambda 來獲得更容易和更有表現力的東西。

基本上,您的 Action 與 JDK 中的標准 Consumer 相同,只是方法的名稱發生了變化。

然后 defaultAction 看起來像這樣:

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

所以 AnotherActionSet 可以這樣表達:

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

您還會發現流程和操作的作用完全相同(獲取 T 並且不返回任何內容),因此其中一個概念是多余的。 你可以寫:

Consumer<Double> anotherActionFlow = anotherActionSet;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM