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脱机

 

posted @ 2016-04-28 15:01  熠然  阅读(514)  评论(0编辑  收藏  举报