java - java設計 Pattern 與lambda類似函數

  显示原文与译文双语对照的内容
90 5

我想找出一種方法或者 Pattern 來簡化我的服務類,使它變得可以調整。 我的目標是訪問服務類中的方法,例如使用或者謂詞訪問。


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() {}



}



所以我的意思是我可以改變它,以便使用或者"固定"方法,但是它會知道我需要從客戶端獲取什麼。

如果這個問題是壞的,並且不符合規則,請指向我的正確方向,我丟失了。

时间: 原作者:

133 0

我想你想要的是


class Service {



 private Client client;



 public void fix(Consumer<Client> consumer){


 consumer.accept(client);


 method();


 }



 private void method() {}


}



你可以使用


service.fix(Client::fetchB);



原作者:
78 2

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


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



65 2

為什麼不乾脆


class Client {



 public A fetch (String identifier) {



 ArrayList<String> identifiers =.. .;



//validate user-provided identifier here



 if (___.equals(identifier)) {


//specific code for each identifier


 } else if {


//...etc.


 }



 }


}



class Service {



 Client client;



 public void fix (String identifier){


 client.fetch(identifier);


 method();


 }



 void method() {}



}



131 1

這個問題可能有些意見,但讓我們嘗試一下。

從我看來,首先設計的缺陷是將所有 fetchXYZ 方法放入一個客戶機。 你可以創建一個可能看起來像這樣的介面 Client


interface Client<T> {


 T fetch();


}



並創建這裡介面的實現,如下所示:


public class ClientA implements Client<A> {


 @RequestLine("something/a")


 public A fetch() {


//do fetch stuff


 }


}



你可以在地圖中本地存儲客戶端實現的實例,或者使用工廠 Pattern 來根據你的輸入創建合適的客戶端。 並且 finally 中的fix 方法可能如下所示:


public void fix(String clientType) {


//returns instance of ClientA for 'a' for example


 final Client client = getClientForType(clientType);


 client.fetch();


 method();


}



可能有很多方法來解決你的需求,這隻是其中之一。

我個人不喜歡將客戶端函數作為參數傳遞給你的方法( 儘管你要求),在你當前的設計 Client 中不同。 使用lambdas實際上加強了這個缺陷,並隱藏了 Client 真正。

只有 2美分。

原作者:
...