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