java开发之匿名内部类,接口的使用
下面的例子是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开发之匿名内部类,接口的使用的更多相关文章
- Java开发中模拟接口工具moco的使用
场景 在开发中需要依赖一些接口,比如需要请求一个返回Json数据的接口,但是返回Json数据的接口要么是没搭建,要么是交互比较复杂. 此时,就可以使用moco来模拟接口返回接口数据,以便开发和测试工作 ...
- 吴裕雄--天生自然 JAVA开发学习:接口
[可见度] interface 接口名称 [extends 其他的接口名] { // 声明变量 // 抽象方法 } import java.lang.*; //引入包 public interface ...
- Java开发笔记(六十)匿名内部类的优势
前面依次介绍了简单接口和扩展接口,给出的范例都是自定义的接口代码,其实Java系统本身就自带了若干行为接口,为了更好地理解系统接口的详细用法,接下来还是从一个基础的例子出发,抽丝剥茧地逐步说明接口的几 ...
- Java开发笔记(六十二)如何定义函数式接口
前面介绍了Lambda表达式的用法,从实践中发现它确实极大地方便了开发者,然而不管是匿名内部类还是Lambda表达式,所举的例子都离不开各类数组的排序方法,倘使Lambda表达式仅能用于sort方法, ...
- Java开发知识之Java中的集合Set接口以及子类应用
---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...
- Java开发知识之Java中的集合上List接口以及子类讲解.
Java开发知识之Java中的集合类 一丶什么是集合类 如果你学习说数据结构,那么学习集合就很简单. 因为集合就是存储数据的结构. 例如 有链表结构 (list ) 还有 map结构.等等. 集合类就 ...
- Java开发知识之Java的继承多态跟接口*
Java开发知识之Java的继承多态跟接口 一丶继承 1.继承的写法 在Java中继承的 关键字是 extends 代表一个类继承另一个类. 继承的含义以及作用: 继承就是基于某个父类的扩展.制定出来 ...
- Java开发笔记(五十八)简单接口及其实现
前面介绍了抽象方法及抽象类的用法,看似解决了不确定行为的方法定义,既然叫唤动作允许声明为抽象方法,那么飞翔.游泳也能声明为抽象方法,并且鸡类涵盖的物种不够多,最好把这些行为动作扩展到鸟类这个群体,于是 ...
- Java开发笔记(五十九)Java8之后的扩展接口
前面介绍了接口的基本用法,有心的朋友可能注意到这么一句话“在Java8以前,接口内部的所有方法都必须是抽象方法”,如此说来,在Java8之后,接口的内部方法也可能不是抽象方法了吗?之所以Java8对接 ...
随机推荐
- Scrum10-22
Time:2013-10-22 Author:居玉皓 Things we have done since yesterday's meeting: 在今天的Scrum中,STORY1 开发前期准备工作 ...
- SQL Server数据库事务日志序列号(LSN)介绍
原文:http://blog.csdn.net/tjvictor/article/details/5251463 日志序列编号(LSN)是事务日志里面每条记录的编号. 当你执行一次备份时,一些 ...
- bug集合
解决方法:vertical-align:top; 垂直对齐方式:对浮动元素无效浮动类: ie 6 7要在一行显示多个div要 给每一个元素浮动 否则会出间隙. ie6双倍边距bug 1. bug条件 ...
- HDOJ 3547 DIY Cube 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3547 题目大意:求用$C$种颜色给立方体的8个顶点染色的本质不同的方法.两种方法本质不同即不能通过旋转 ...
- 【POJ】【2960】S-Nim
博弈论 这题跟 BZOJ 1874 取石子游戏 差不多 先暴力求出10000以内的SG函数(利用定义来求即可) 然后每次询问直接将SG值异或起来即可…… Source Code Problem: Us ...
- 清除HTML中的特殊字符
/// <summary> /// 清楚HTML中的特殊字符 /// </summary> /// <param name=&q ...
- 首次push本地代码到github上出现的问题及解决方案
刚创建的github版本库,在push代码时出错: $ git push -u origin masterTo git@github.com:******/Demo.git ! [rejected] ...
- iOS开发之ARC&MRC混用
Xcode 项目中我们可以使用 ARC 和非 ARC 的混合模式. 如果你的项目使用的非 ARC 模式,则为 ARC 模式的代码文件加入 -fobjc-arc 标签. 如果你的项目使用的是 ARC 模 ...
- ASP.NET WebAPI2 发布之后404 Note Found
方法一:首先确保服务器安装.Net FrameWork 4.0 并且注册IIS 如果先安装.net framework4.0,再安装IIS,则会出现4.0的ISAPI没有注册的情况. 运行:C:\Wi ...
- Struts2 常用的常量配置
在struts2-core-2.1.8.1.jar的org.apache.struts2包下面的default.properties资源文件里可以查到常用的常量配置,这些不用刻意的记住:忘记的时候可以 ...