2012-10-31 3 views
1

서버에서 데이터를 쉽게 검색 할 수 있도록 "네트워크 연결"을 설계하려고합니다. 그러나, 나는 디자인 문제에 직면 해있다. 내가 사용하는거야OOP 구조 디자인

NetworkUtil 클래스는 일단 내가 resultType을 확인하고 해당 매개 변수의 결과를 사용, 도착 결과

class NetworkUtil 
    public NetworkUtil(URL, resultType); // resultType might be XML or RAW 
    public setListener(listener); // listener will notice when result has arrive 
    public addPostData(key, value); 
    public connect(); // connect start new thread, so result will shown in listener 

interface NetworkUtilListener1 
    public onNetworkFail(); 
    public onNetworkSuccess(URL, resultType, xml, raw); 

interface NetworkUtilListener2 
    public onNetworkFail(); 
    public onNetworkSuccessRAW(URL, resultType, raw); 
    public onNetworkSuccessXML(URL, resultType, xml); 

으로 설계되었다. 그러나 위에 표시된 2 가지 예 (NetworkUtilListener1NetworkUtilListener2)에서는 이후 resultType이 JSON, 이미지 또는 내 사용자 정의 유형과 같은 경우 향후 문제를 고려하므로 팀에서 쉽게 사용할 수 있습니다.

NetworkUtilListener1

는 생각으로 좋은 디자인이 아닌

onNetworkSuccess(URL, resultType, raw, xml, json, image); 

처럼 오랫동안 사용되지 않는 매개 변수가됩니다.

NetworkUtilListener2 대부분의 경우 우리는 각 프로젝트에서 1 또는 2 가지 유형의 결과 만 선호하므로 대부분의 빈 방법을 사용하는 콘크리트 클래스를 강제로 사용하게됩니다.

onNetworkSuccessRAW(URL, resultType, raw); 
onNetworkSuccessXML(URL, resultType, xml); 
onNetworkSuccessJSON(URL, resultType, json); 
onNetworkSuccessImage(URL, resultType, image); 

누구나이 클래스 구조를 재 설계하거나 나에게 집중해야 할 디자인 패턴을 제안 할 수 있습니다. 그래서 나는 더 나은 NetworkListener 수 있습니다.

답변

0

이 고전 visitor pattern에 대한 해결책 같은 소리 :

이의이 NetworkListener 방법 과부하를 시작하자 :

interface NetworkListener { 
    void onSuccess(XMLResult xml); 
    void onSuccess(JSONResult json); 
} 

그런 제안,의 결과 여러 구현을 가질 수 있습니다. 모든 사람들은 적절한 오버로드 된 메소드를 호출하여 리스너에게 알릴 수 있습니다.이제

interface Result { 
    void notify(NetworkListener listener); 
} 

class XMLResult implements Result { 

    @Override 
    public void notify(NetworkListener listener) { 
     listener.onSuccess(this); 
    } 

} 

class JSONResult implements Result { 

    @Override 
    public void notify(NetworkListener listener) { 
     listener.onSuccess(this); 
    } 
} 

,의는 샘플 네트워크 리스너 구현가 실제로 어떻게 보이는지 확인해 보겠습니다 :

class SampleListner implements NetworkListener{ 

    @Override 
    public void onSuccess(XMLResult xml) { 
     // handle here 
    } 

    @Override 
    public void onSuccess(JSONResult json) { 
     // handle here 

    } 
} 

그리고 알림 코드는 다소과 같습니다 패턴에 크게 의존하기 때문에

Result result = null; 
for(NetworkListener listener: listeners){ 
    result.notify(listener); 
} 

메서드 오버로딩을 사용하면 Result 개체를받는 catch-all 메서드를 추가 할 수 있습니다. 즉, Result의 새 구현이 만들어지면 여전히 해당 개체에 대한 기본 처리 방법이 제공됩니다. 오버로드 메서드를 추가하지 않는 경우.

+0

답변 해 주셔서 감사합니다.하지만 솔루션에 NetworkUtilListener2와 동일한 문제가 있다고 생각합니다. 구체적인 클래스 (예 : SampleListener)가 많은 빈 메서드를 구현해야합니다. 그러나 코드에서 하나의 아이디어를 제안합니다. 리스너를위한 인터페이스 대신 클래스를 사용하는 경우 실제 concreate 클래스는 인터페이스에서 모든 기능을 가질 필요가 없습니다. 하지만 여전히 좋은 생각이라고 확신하지 못합니다. – Chetchaiyan

+0

@Chetchaiyan 방문자 패턴에는 고려해야 할 많은 이점이 있습니다. 코드가 모든 유형의 결과를 개별적으로 처리하기 때문에 많은 방법을 구현해야하는 필요성에 대해서는 의도적으로 설계된 것입니다. 그러나 모든 메소드의 빈 구현을 사용하여 abstact 클래스 (예 : NetworkUtilsAdapter)를 정의 할 수 있습니다 (일부 Java Swing 수신기 [즉, WindowAdapter]에서 사용되는 전략과 유사). 그런 다음 실제 리스너 구현은이 추상 어댑터를 확장하고 관심있는 특정 메소드를 구현할 수 있습니다. –

2

대신 유형과 결과를 수신, 다형성을 사용합니다

public interface Result { ... } 

public class XmlResult implements Result { ... } 

을 미래에 당신은 당신이 필요한만큼을 추가 할 수 있습니다.

public class JSonResult implements Result { ... } 

마지막으로, 당신은 내가 NetworkUtil이 형식 유형에 대해 걱정한다고 생각하지 않습니다이 인터페이스

interface NetworkUtilListener1 
    public onNetworkFail(); 
    public onNetworkSuccess(URL, result); 
0

있을 것이다. NetworkListener가 NetworkUtil에 등록되도록하고 NetworkUtil이 성공시 수신기에 알리도록하십시오. NetworkListener는 결과를 처리하는 유일한 유형이므로 걱정하지 마십시오. 당신이 편리하므로 새로운 청취자를 활용할 수있는 몇 가지 기본 파서을 할 수 있습니다 뭔가 노트

class NetworUtil{ 
    registerListener(listener){ mylisteners.push(listener); } 
    notifyListener(){ for(listener: mylisteners){ listener.onSuccess(myresult); } 
} 

class Listener1{ 
    Listener1(){ registerWithNetworkUtil(); } 
    void onSuccess(myresult){ 
     if(myresult.isXML){ parseXML(myresult); } 
     else if(myresult.isJSON()){ parseJSON(myresult); } 
     else if(myresult.isXXYYZZ()){ parseXXYYZZ(myresult); } 
    } 
} 

같아야합니다.

+0

그리고 코드에서 'myresult'의 유형은 무엇입니까? –

+0

위의 코드는 psuedo-code이거나 원시 결과에 대한 래퍼 일 수 있습니다. – dchhetri

+0

문자열에 isJSON() 또는 isXML()과 같은 메소드가 없습니다. –