我尝试设计“网络连接”为轻松地使用从服务器获取数据。 不过,我面临的一个设计问题。
我NetworkUtil
类我将使用被设计成
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);
一旦得出结果,我会检查与resultType并从参数中使用的结果。 然而,在上面显示2例( NetworkUtilListener1
和NetworkUtilListener2
),我认为以备将来使用的问题时,更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
。
这听起来像经典的解决方案访问者模式 :
让我们通过重载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);
}
由于该模式在很大程度上依赖于方法重载可以添加接收结果对象一个包罗万象的方法,这将保证,如果创建结果的任何新的实现,你仍然可以得到一个默认为它们处理如果不进一步增加超载方法。
相反,接收类型和结果,利用多态:
public interface Result { ... }
public class XmlResult implements Result { ... }
而在未来,你可以添加你需要尽可能多的。
public class JSonResult implements Result { ... }
最后,你都会有这样的接口
interface NetworkUtilListener1
public onNetworkFail();
public onNetworkSuccess(URL, result);
我不认为NetworkUtil应该担心格式类型。 只是让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); }
}
}
注意,您可能希望有一些默认的解析器得心应手所以新的听众可以利用它们。