我组织类时无意间遵守了依赖倒置原则
我每次开始写一个小项目的时候,都想把项目中的那些类组织得优雅一些,但最后的代码总是一团糟,这让我很痛苦。我把希望寄托于设计模式,希望它能帮我解脱。遗憾的是,从接触设计模式到现在,已经快三年了,我的代码就只出现过单例模式。不过,从今天开始,一切都不一样了,我的代码里多了依赖倒置原则。 public interface FileOperate {
public void action(File file);
}
然后可以开始写文件工具类了: public class FileTools {
/** * 单线程后根遍历文件树,对遇到的文件及文件夹执行指定的操作 * * @param startDirectory 起始目录 * @param fileOperate 对目录的操作 * @param fileOperate 对文件的操作 */
public static void traverse(File startDirectory,FileOperate directoryOperate,FileOperate fileOperate) {
File[] childFiles = startDirectory.listFiles();
for (File file : childFiles) {
if (file.isFile()) {
fileOperate.action(file);
} else {
traverse(file,directoryOperate,fileOperate);
}
}
directoryOperate.action(startDirectory);
}
}
文件工具类写好了,后来,我知道我想删除某个文件树上所有文件名包含index的文件,但是不对遇到的文件夹做任何操作,于是我写了下面两个类,传给FileTools的traverse方法: public class DoNothing implements FileOperate {
@Override
public void action(File file) {
}
}
public class DeleteIndexFile implements FileOperate {
@Override
public void action(File file) {
String fileName = file.getName();
if (fileName.contains("index")) {
file.delete();
}
}
}
后来,我又想删除某文件树中的非html文件以及空文件夹。于是,我又写了下面两个类传给FileTools的traverse方法: public class DeleteEmptyDirectory implements FileOperate {
@Override
public void action(File file) {
if (file.isDirectory()) {
file.delete();
}
}
}
public class DeleteNoneHtmlFile implements FileOperate {
@Override
public void action(File file) {
String fileName = file.getName();
if (!fileName.endsWith("html")) {
file.delete();
}
}
}
到这里,大家应该发现,FileOperate和FileTools的设计是对扩展开放的,对修改关闭的,它是一个不错的设计。为什么会有这样的结果了,因为它遵守了依赖倒置原则。FileTools依赖FileOperate,DoNothing 等具体实现类也依赖FileOperate,它们都依赖抽象, 高层模块(FileTools)不依赖底层模块(DoNothing )。 我的这个遵守依赖倒置原则的小项目说完了,现在来说说,理解这个原则的难点——倒置体现在哪里?通常情况,是高层依赖底层,就像靠纳税人钱生活的人总是依赖着纳税人,毕竟拿人家的手短,这和FileTools使用具体的操作一样,但是现在FileTools不直接依赖具体操作了,它只是依赖抽象FileOperate,而具体操作也依赖抽象FileOperate,抽象是最高层,于是变成了低层依赖高层了,这类似于我们经常感受不到那些靠纳税人钱活着的人真是如此,因为我们的税是由第三方交的。 最后,我可以说,我的代码变得优雅了一点儿了,设计模式是可以指望的。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |