用惯了windows, 当发觉android没有原生的文件管理器或类似模块的时候,感觉非常不合理。android sdk似乎也没有提供类似的组件以让程序调用,没办法,也就只好自己动手做。当然,我也不是从头开始,网上有很多朋友已经做过了,我拿过来改改,顺便加了点自己的东西。先把实现的效果显示一下:




具体实现大家可以看:http://blog.csdn.net/trbbadboy/article/details/7899424

我使用该朋友的代码时,利用设计模式对原有设计做了改进,在实现文件选择器时,一个问题在于文件的图标如何显示,在原有设计中,文件与图标的对应关系是写死的,伪码如下:

if (fileExtension == "wav") {

setIcon("wav.png");

}

if (fileExtension == "txt") {

setIcon("txt.png");

}

.......

这种方法有一个问题,由于实际运用中,文件种类太多,这样,代码中将会有大量的if else 结构,这样的代码结构导致的问题是无法扩展,当有新的文件类型时,需要改动代码,增加if else分支,当某种文件图标由于升级而改变后,代码需要在众多if else 中找到相应的位置并改动,因此这种代码模式是难以适应需求变化的,无法达到面向对象的设计中,open for extension, closed for modification 的标准,处理这种情况,最好的方法就是运用设计模式中的责任链模式。


为了重构 上述代码,我们先定义一个接口,文件选择器要获取文件图标时,调用接口,这样,图标的获取就和文件选择器的逻辑实现解耦合了:

public interface FileIconManager {int getIconByExtension(String extension);}

接着我们将上面的if 实现分别封装到具体的类中,例如,获取二进制文件的图标,我们这么实现:

public class BinaryFileIcon implements FileIconManager{public int getIconByExtension(String extension){return R.drawable.binary;}}


获取wav文件图标,我们这么实现:

public class WavFileIcon extends BinaryFileIcon{    private String wavExtension = "wav";public int getIconByExtension(String extension)    {    if (extension == wavExtension)    {    return R.drawable.wavfile;    }    else    {    return super.getIconByExtension(extension);    }    }}

大家可以发现,如果当前文件的后缀与具体实现类中的需求不一样,那么就把这个请求提交给他的父类,这就相当于原来代码中,一个if不满足,接着判断下一个if. 于是子类和父类构成了一个处理链条。这么做好处比原来一对if else要好很多,一是容易扩张,如果需要添加新的图标,例如需要再添加一个vod后缀的图标,我们只要再重新实现一个类,然后将该类继承于WavFileIcon即可。二是容易更改,当我们要修改某个图标时,只要找到相应的图标类进行修改,而不用影响其他图标的获取代码,保证修改不影响程序的质量。


具体代码的实现,大家可以下载程序代码看看,希望大家多给予批评和指导


更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. 一款常用的 Squid 日志分析工具
  3. GitHub 标星 8K+!一款开源替代 ls 的工具你值得拥有!
  4. RHEL 6 下 DHCP+TFTP+FTP+PXE+Kickstart 实现无人值守安装
  5. Linux 环境下实战 Rsync 备份工具及配置 rsync+inotify 实时同步
  6. Android(安卓)APP如何防止二次打包揭秘。
  7. 学习Android(安卓)Studio开发工具之Activity1
  8. Android图标尺寸的约定
  9. [置顶] Android(安卓)4.0 中由ProGuard引发的一场血案

随机推荐

  1. Android学习笔记之——UI设计
  2. android异步的几种方式
  3. Android单元测试框架-Espresso
  4. android 播放来电铃声
  5. android中动画的使用
  6. unity在android显示界面(UnityPlayerActiv
  7. LinearLayout和RelativeLayout的属性差异
  8. 存储容量检测 注意构建StatFs对象的参数
  9. Android_判断文件是否存在并创建代码
  10. 编译Android 使用 Java5 还是 Java6