下面的例子是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脱机

java开发之匿名内部类,接口的使用的更多相关文章

  1. Java开发中模拟接口工具moco的使用

    场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...

  2. 吴裕雄--天生自然 JAVA开发学习:接口

    [可见度] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法 } import java.lang.*; //引入包 public interface ...

  3. Java开发笔记(六十)匿名内部类的优势

    前面依次介绍了简单接口和扩展接口,给出的范例都是自定义的接口代码,其实Java系统本身就自带了若干行为接口,为了更好地理解系统接口的详细用法,接下来还是从一个基础的例子出发,抽丝剥茧地逐步说明接口的几 ...

  4. Java开发笔记(六十二)如何定义函数式接口

    前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...

  5. Java开发知识之Java中的集合Set接口以及子类应用

    ---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...

  6. Java开发知识之Java中的集合上List接口以及子类讲解.

    Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...

  7. Java开发知识之Java的继承多态跟接口*

    Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...

  8. Java开发笔记(五十八)简单接口及其实现

    前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...

  9. Java开发笔记(五十九)Java8之后的扩展接口

    前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...

随机推荐

  1. Java对象的序列化与反序列化

    序列化与反序列化 序列化 (Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程.一般将一个对象存储至一个储存媒介,例如档案或是记亿体缓冲等.在网络传输过程中,可以是字节或是 ...

  2. Java Web应用中调优线程池的重要性

    不论你是否关注,Java Web应用都或多或少的使用了线程池来处理请求.线程池的实现细节可能会被忽视,但是有关于线程池的使用和调优迟早是需要了解的.本文主要介绍Java线程池的使用和如何正确的配置线程 ...

  3. Css compatibility

    http://meiert.com/en/indices/css-properties/ http://www.standardista.com/css3/css3-selector-browser- ...

  4. 在云服务器搭建WordPress博客(五)创建和管理文章分类

    不同主题的文章划分到不同的分类,有助于访客寻找他们想要的内容,提高用户体验.所以,为你的网站创建文章分类是很有必要的.那么,WordPress系统如何创建和管理文章分类呢?今天倡萌就简单介绍一下. 创 ...

  5. 1458: 士兵占领 - BZOJ

    Description 有一个M * N的棋盘,有的格子是障碍.现在你要选择一些格子来放置一些士兵,一个格子里最多可以放置一个士兵,障碍格里不能放置士兵.我们称这些士兵占领了整个棋盘当满足第i行至少放 ...

  6. NOI2014 全国互测Round2

    数据包:http://pan.baidu.com/s/1pJNSkL9 T1: 我们先直接用矩阵快速幂暴力 首先是0维,f1=1,f2=1 然后推出下一维的f1'和f2' 下一维的f1'和f2'其实就 ...

  7. 1021 玛丽卡 - Wikioi

    题目描述 Description麦克找了个新女朋友,玛丽卡对他非常恼火并伺机报复. 因为她和他们不住在同一个城市,因此她开始准备她的长途旅行. 在这个国家中每两个城市之间最多只有一条路相通,并且我们知 ...

  8. Matlab实现求a到b被c整除的个数

    我先想到的是for循环........ 然后sum(find(mod(a:b,c)==0)),从10到100得到874,为什么不对呢? 比如a = [1 2 3 4  2 3 4 2],find(a= ...

  9. Ubuntu下非常给力的下载工具--uget+aria2

    转自Ubuntu下非常给力的下载工具--uget+aria2 Windows下的下载工具--迅雷,之所以下载速度快,乃是它能搜索资源.为己所用,而不是仅仅从原始地址这单一资源处下载. Ubuntu下也 ...

  10. netbeans 7安装xdebug调试php程序

    1.下载安装xdebug 先从xdebug官网下载对应php版本的xdebug组件,下载地址是:http://www.xdebug.org/download.php 如果不确定下载哪个版本的xdebu ...