zoukankan      html  css  js  c++  java
  • 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脱机
  • 相关阅读:
    Simulink仿真入门到精通(一) Simulink界面介绍
    Learn Regex The Easy Way
    C语言程序设计(十三) 文件操作
    C语言程序设计(十二) 结构体和共用体
    C语言程序设计(十一) 指针和数组
    C语言程序设计(十) 字符串
    C语言程序设计(九) 指针
    C语言程序设计(八) 数组
    C语言程序设计(七) 函数
    C语言程序设计(六) 循环控制结构
  • 原文地址:https://www.cnblogs.com/liyiran/p/5442709.html
Copyright © 2011-2022 走看看