这个小项目主要是练习了在事件侦听中使用代码低耦合,但是这篇总结中还会记录一些实际代码中技巧性的东西。
首先说明低耦合的设计模式。所谓低耦合,意思就是减少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; }