下面的例子是Java.JDK7学习笔记上的
打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息
1.Client.java
public class Client {
private static final String TAG = "Client"; public final String ip;
public final String name; public Client(String ip, String name) {
this.ip = ip;
this.name = name;
}
}
2.程序中建立的client对象,都会加入ClientQueue集中管理,若程序中其他部分希望在ClientQueue的Client加入或移除时可以收到通知,以便做一些处理,那么可以把Client加入或移除的信息包装为ClientEvent
ClientEvent.java
public class ClientEvent {
private static final String TAG = "ClientEvent";
private Client client; public ClientEvent(Client client) {
this.client = client;
} public String getName(){
return client.name;
} public String getIp(){
return client.ip;
}
}
3.定义ClientListener接口,如果有对象对client加入ClientQueue有兴趣,可以操作这个接口
ClientListener.java
public interface ClientListener { void clientAdded(ClientEvent event); void clientRemoved(ClientEvent event);
}
4.ClientQueue.java,其中注释的部分为书中内容,我不明白为什么使用一个list处理,因为集合里面只有一个listener,可能是为了多个对象监听的。我修改了自己的代码。
public class ClientQueue {
private List< Client > clients = new ArrayList<>();
// private List< ClientListener > listeners = new ArrayList<>();
private ClientListener listener; public void addClientListener(ClientListener listener) {
// listeners.add(listener);
this.listener = listener;
} public void add(Client client) {
clients.add(client);
ClientEvent event = new ClientEvent(client);
// for ( ClientListener l : listeners ) {
// l.clientAdded(event);
// }
listener.clientAdded(event);
} public void remove(Client client) {
clients.remove(client);
ClientEvent event = new ClientEvent(client);
// for ( ClientListener l : listeners ) {
// l.clientRemoved(event);
// }
listener.clientRemoved(event);
}
}
原文:如果有对象对client加入ClientQueue有兴趣,可以操作ClientListener,并通过addClientListener()注册,当每个Client通过ClientQueue的add()收集时,接着使用ClientEvent封装Client相关信息,再使用fot循环将注册的ClientListener逐一取出,并调用clientAdded()方法进行通知。如果有对象被移除,流程类似,这可以在ClientQueue的remove()方法中看到相关程序代码。
5.测试部分:
@Test
public void test8() throws Exception{
ClientQueue queue=new ClientQueue();
queue.addClientListener(new ClientListener() {
@Override
public void clientAdded(ClientEvent event) {
System.out.println(event.getName()+" 从 "+event.getIp()+"联机");
} @Override
public void clientRemoved(ClientEvent event) {
System.out.println(event.getName()+" 从 "+event.getIp()+"脱机");
}
}); Client c1=new Client("192.168.0.1","haha");
Client c2=new Client("10.88.6.2","jerome"); queue.add(c1);
queue.add(c2); queue.remove(c1);
queue.remove(c2);
}
6.执行结果:
haha 从 192.168.0.1联机
jerome 从 10.88.6.2联机
haha 从 192.168.0.1脱机
jerome 从 10.88.6.2脱机