需求:设计一个图片加载工具类。
要求:职责单一、可扩展性强、实现三级缓存,遵循开闭原则。
1.改造前原始代码
1 | package com.anloq.sdk.imageloader; |
2.遵循单一原则将原始类分为加载和缓存两个类(功能)
2.1.图片加载类为:
1 | package com.anloq.sdk.imageloader; |
2.2.缓存类为
1 | package com.anloq.sdk.imageloader; |
3.提高扩展性,增加SD卡缓存
以上将代码的功能分开了,逻辑更清晰了,职责也单一了,但是可扩展性还是比较差,接下来进行增加SD卡缓存。
3.1增加SD卡缓存类
1 | package com.anloq.sdk.imageloader; |
3.2ImageLoader中增加一个boolean值来设置使用哪种缓存方式
1 | package com.anloq.sdk.imageloader; |
4.进一步改造,使用双缓存,优先使用内存加载,如果无再使用SD卡缓存
以上代码修改虽然增加了SD卡缓存,但是为了节省用户的流量及加载速度我们应该设计成优先使用内存加载,如果无再使用SD卡缓存。
4.1增加双缓存类
1 | package com.anloq.sdk.imageloader; |
4.2ImageLoader增加双缓存配置
1 | package com.anloq.sdk.imageloader; |
以上改造总算可以了,但是这样每次增加缓存策略都要修改源代码,这样很有可能引入bug,所以我们的原则是要对修改关闭,对扩展开放,这样以后有新需求的时候我们就可以使用扩展的方法来实现。
5.抽象公共方法的接口
5.1接口抽取
1 | package com.anloq.sdk.imageloader; |
5.2ImageLoader注入接口的实现类
1 | package com.anloq.sdk.imageloader; |
5.3内存缓存、SD卡缓存和双缓存分别实现接口
1 | package com.anloq.sdk.imageloader; |
内存缓存、SD卡缓存实现同上。
6.外部调用及设置缓存策略
1 | private void loadImage() { |
经过上述代码的重构,我们可以通过setImageCache(ImageCache cache)方法注入不同的缓存实现,来使得ImageLoader更简单、健壮、扩展性好灵活性也更高。以上三种缓存图片的具体实现完全不一样,但是它们都有一个共同的特点是都实现了ImageCache接口。当用户需要增加一种新的缓存策略时,我们只需新建一个实现ImageCache接口等待类就可以了,这样就实现了千变万化的缓存策略,并且新扩展的策略不会影响导致ImageLoader类的修改,这正是体现了“对修改关闭,对扩展开放的”原则,所以,我们在设计写代码的时候应该认真地进行思考,希望大家一起思考,一起学习,有所成长!
源码下载链接:
https://github.com/xinpengfei520/MyImageLoader
如果本文对你有帮助,欢迎大家点赞、评论,码字不易,再小的支持也是对博主的莫大鼓励!
今天的分享就到这里,如需转载,请注明出处,谢谢!
声明:文中部分代码摘录自《Android源码设计模式》一书。
注:本文由博主原创,转载请注明出处,谢谢!