java开发之匿名内部类,接口的使用
下面的例子是Java.JDK7学习笔记上的
打算开发多人联机程序,对每个联机客户端,都会建立Client对象封装相关信息
1.Client.java
1 public class Client { 2 private static final String TAG = "Client"; 3 4 public final String ip; 5 public final String name; 6 7 public Client(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 class ClientEvent { 2 private static final String TAG = "ClientEvent"; 3 private Client client; 4 5 public ClientEvent(Client client) { 6 this.client = client; 7 } 8 9 public String getName(){ 10 return client.name; 11 } 12 13 public String getIp(){ 14 return client.ip; 15 } 16 }
3.定义ClientListener接口,如果有对象对client加入ClientQueue有兴趣,可以操作这个接口
ClientListener.java
1 public interface ClientListener { 2 3 void clientAdded(ClientEvent event); 4 5 void clientRemoved(ClientEvent event); 6 }
4.ClientQueue.java,其中注释的部分为书中内容,我不明白为什么使用一个list处理,因为集合里面只有一个listener,可能是为了多个对象监听的。我修改了自己的代码。
1 public class ClientQueue { 2 private List< Client > clients = new ArrayList<>(); 3 // private List< ClientListener > listeners = new ArrayList<>(); 4 private ClientListener listener; 5 6 public void addClientListener(ClientListener listener) { 7 // listeners.add(listener); 8 this.listener = listener; 9 } 10 11 public void add(Client client) { 12 clients.add(client); 13 ClientEvent event = new ClientEvent(client); 14 // for ( ClientListener l : listeners ) { 15 // l.clientAdded(event); 16 // } 17 listener.clientAdded(event); 18 } 19 20 public void remove(Client client) { 21 clients.remove(client); 22 ClientEvent event = new ClientEvent(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 @Test 2 public void test8() throws Exception{ 3 ClientQueue queue=new ClientQueue(); 4 queue.addClientListener(new ClientListener() { 5 @Override 6 public void clientAdded(ClientEvent event) { 7 System.out.println(event.getName()+" 从 "+event.getIp()+"联机"); 8 } 9 10 @Override 11 public void clientRemoved(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脱机
直面挑战,躬身入局