概念
观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。
应用观察者模式的实例
//HttpUtils 是实现了数据的处理的工具类,数据处理完毕后,将结果返回给主界面
public class HttpUtils {
/**
* 相比于普通的带返回值的方法,观察者模式可以返回多个参数值
* 可以放入到不同的线程,虽然我不懂,哇哈哈
* @author Administrator
*
*/
//定义接口的方法
public interface onHttpListener {
public void onFail(int code);
public void onSuccess(String line);
}
//定义静态方法,参数中包括接口的对象
public static void sendRequest(String urls, String param, onHttpListener listener) {
try {
//建立连接,向服务器发送数据
URL url = new URL(urls);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(1000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setDoOutput(true);
conn.setDoInput(true);
conn.getOutputStream().write(param.getBytes());
int code = conn.getResponseCode();
BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
//根据服务器返回值,执行不同的操作
String line = br.readLine();
if (code == HttpURLConnection.HTTP_OK) {
//调用接口对象的方法,会将参数传递给实现接口的代码的字段,传递的字段是服务器的返回值,
listener.onSuccess(line);
} else {
//调用接口对象的方法,会将参数传递给实现接口的代码的字段
listener.onFail(code);
}
} catch (MalformedURLException e1) {
e1.printStackTrace();
listener.onFail(-1);
} catch (IOException e1) {
e1.printStackTrace();
listener.onFail(-1);
}
}
}
//在另一个主界面的类中实现了接口的方法,用于显示返回的值
logInBtn.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
loginRequest();
}
private void loginRequest() {
String name = nameText.getText();
String password = passwordText.getText();
String param = postLoginJson(name, password);
System.out.println(param);
String urls = "http://localhost:8080/MyFirWEB/CheckServlet";
//对接口的实现,HttpUtils 工具类中接口对象调用接口方法时,会将参数传递至此,在进行相关的处理
HttpUtils.sendRequest(urls, param, new onHttpListener() {
@Override
public void onSuccess(String line) {
JSONObject obj = JSONObject.fromObject(line);
int jsonCode = obj.getInt("jsonCode");
String message = obj.getString("message");
switch (jsonCode) {
case LOGIN_SUCCESS:
BackDialog.create(message);
break;
case LOGIN_FAIL:
BackDialog.create(message);
break;
}
}
@Override
public void onFail(int code) {
BackDialog.create(code + "");
}
});
}
});
- 上面这种设计,实现了数据处理和界面显示的分离,