亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有 lambda 的相似函數的設計模式

具有 lambda 的相似函數的設計模式

料青山看我應如是 2021-09-15 16:15:25
我試圖找出一種方法或模式來簡化我的 Service 類并使其非??烧{。我的目標是讓 Service 類中的方法可以被訪問,例如使用 lambdas 或 Predicates。class Client {  @RequestLine("something/a")  public A fetchA() {}  @RequestLine("something/b")  public B fetchB() {}  //... lots of similar methods  @RequestLine("something/z")  public Z fetchZ() {}}class Service { Client client; public void fixA(){  client.fetchA();  method(); } public void fixB(){  client.fetchB();  method(); }// ... lots of similar methods public void fixZ(){  client.fetchZ();  method(); } void method() {}}所以我的觀點是如何更改它,以便它使用 lambdas 或其他可以讓我的 Service 類使用“修復”方法之一的東西,但它會知道我需要從我的客戶端獲取什么。如果這個問題很糟糕并且不符合這里的規則,那么請指出我正確的方向,因為我迷路了。
查看完整描述

3 回答

?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

我想你想要的是


class Service {


    private Client client;


    public void fix(Consumer<Client> consumer){

        consumer.accept(client);

        method();

    }


    private void method() {}

}

您可以使用


service.fix(Client::fetchB);


查看完整回答
反對 回復 2021-09-15
?
繁星點點滴滴

TA貢獻1803條經驗 獲得超3個贊

這個問題可能有點基于意見,但讓我們試一試。


在我看來,您制造的第一個設計缺陷是將所有fetchXYZ方法都放在一個客戶端中。你可以創建一個Client看起來像這樣的界面


interface Client<T> {

  T fetch();

}

并像這樣創建這個接口的實現:


public class ClientA implements Client<A> {

  @RequestLine(”something/a“)

  public A fetch() {

    // do fetch stuff

  }

}

您可以將客戶端實現的實例本地存儲在地圖中,或者使用工廠模式根據您的輸入創建正確的客戶端。最后fix,您的服務中的方法可能如下所示:


public void fix(String clientType) {

  // returns instance of ClientA for ’a‘ for example

  final Client client = getClientForType(clientType);

  client.fetch();

  method();

}

可能有很多方法可以解決您的需求,這只是其中之一。


我個人不喜歡傳球的客戶端功能作為參數傳遞給你的方法的想法(雖然你問它),在當前的設計Client有不同的責任(取A,B依此類推)。使用 lambda 表達式實際上強化了這個缺陷,并且進一步隱藏了Client實際作用。


只有我的 2 美分。


查看完整回答
反對 回復 2021-09-15
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

一種方法是將調用作為服務方法的參數傳遞給您的客戶端。你需要使用泛型:


class Service {


    Client client;


    public <T> void fix(Function<Client, T> clientCall) {


        T result = clientCall.apply(client);


        // Do something with result


        method();

    }


}

您需要fix按如下方式調用您的服務方法:


service.fix(Client::fetchA);


查看完整回答
反對 回復 2021-09-15
  • 3 回答
  • 0 關注
  • 210 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號