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

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

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

时间:原作者:0个回答

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美分。

原作者:
...