这个小项目主要是练习了在事件侦听中使用代码低耦合,但是这篇总结中还会记录一些实际代码中技巧性的东西。
首先说明低耦合的设计模式。所谓低耦合,意思就是减少java代码的不同模块间的相互依赖性,提高程序代码的可扩展性。java中,通过定义一个事件侦听的接口,统一处理对某一类事件的侦听。例如,在我的端口扫描器中定义了如下一个接口:
/**
* 端口扫描时侦听消息的接口
*
* @author KnightErrant
* @time 上午12:35:49 2010-4-18
*
*/
public interface PortScanListener {
/**
* 将一次成功的扫描通知相应的组件
* @param port 端口号
* @param isAvailable 这个端口是否可用
*/
public void show(int port, boolean isAvailable);
}
定义好接口后,只需将要对响应该类事件的组件继承该接口,并实现接口中的方法即可。例如:
/**
* 显示结果的文本区域
*
* @author KnightErrant
* @time 上午02:01:19 2010-4-18
*
*/
public class myTextArea extends javax.swing.JTextArea implements PortScanListener {
/**
* 实现接口中的方法
*/
public void show(int port, boolean isAvailble){
if(isAvailble){
this.append("检测到可用的端口:"+port+"\r\n");
}
}
}
/**
* 显示扫描进度
*
* @author KnightErrant
* @time 下午09:15:54 2010-4-19
*
*/
public class myProgressBar extends javax.swing.JProgressBar implements PortScanListener {
/**
* 实现接口中的方法
*/
public void show(int port, boolean isAvailble){
count++;
this.setValue(count+this.getMinimum());
if(isDone(port)){
count=0;
}
}
}
然而,接口中的方法其实只做一件事:通知... ...。所以,特定的交互型组件还是要在继承的类中多做点儿文章。例如,一次端口扫描任务可能启动多个线程扫描不同区段的端口,因而接口中的方法无法通知进度条当前扫描过的是第几个端口,这就需要在进度条类中自己定义一个计数器... ...
通过这次“端口扫描器”的练习,不仅对低耦合的事件侦听模式有了基本了解,同时也进一步增进了对程序流程的控制感。附件中为这个小程序的源代码。有两处待完善的地方:、
/**
* 检测用户填写是否正确
* @category 待完善
* @param IP 目标机器IP
* @param first_check_port 端口扫描下限
* @param last_check_port 端口扫描上限
* @return TRUE-输入合法;FALSE-输入不合法
*/
private boolean checkFillings(String IP, int first_check_port, int last_check_port){
return false;
}
/**
* 取得常规子线程划分策略
* @category 待完善
* @param first_check_port 端口扫描下限
* @param last_check_port 端口扫描上限
* @return integer step
*/
private int getDivideStrategy(int first_check_port, int last_check_port){
return 0;
}