让代码变得简洁,清晰
让项目变得更加灵活,更加稳定,有更好的扩展性
单一职责 - (优化代码第一步)
单一职责的定义: 对一个类而言,应该只能有一个引起它变化的原因.一个类应该是一组相关性很高的函数,数据的封装
也就是说一个类应该只负责一件事情: 如果一个类负责了方法M1和方法M2,做两个不同的事情,当方法M1要改变的时候,有可能会影响到方法M2,就有可能会产生问题,所以,我们需要把方法M1,方法M2单独分离成两个类;让每个类只专心处理自己的方法
例如:
public class ImageLoader {
private ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private LruCache<String,Bitmap> mImageCache;
public ImageLoader() {
initImageLoader();
}
private void initImageLoader() {
//最大可使用内存
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheMemory = maxMemory / 4;
mImageCache = new LruCache<String, Bitmap>(cacheMemory){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024 ;
}
};
}
public void displayImage(final String url, final ImageView imageView){
if(mImageCache.get(url) != null){
imageView.setImageBitmap(mImageCache.get(url));
return;
}
imageView.setTag(url);
executorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(url);
if(bitmap == null){
return;
}
if(imageView.getTag().equals(url)) {
imageView.setImageBitmap(bitmap);
}
mImageCache.put(url,bitmap);
}
});
}
}
ImageLoader
是一个加载图片的工具类,实现了加载图片,并且缓存图片到内存,但是这里ImageLoader
既要负责加载图片displayImage,又要管理缓存类的设置,随着功能越来越多,这个类会越来越大
应该遵守单一职责,把缓存部分抽取出来,作为一个单独的类来处理
public class ImageLoader {
private ExecutorService executorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
private ImageCache mImageCache = new ImageCache();
public void displayImage(final String url, final ImageView imageView) {
if (mImageCache.get(url) != null) {
imageView.setImageBitmap(mImageCache.get(url));
return;
}
imageView.setTag(url);
executorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap = downloadImage(url);
if (bitmap == null) {
return;
}
if (imageView.getTag().equals(url)) {
imageView.setImageBitmap(bitmap);
}
mImageCache.put(url, bitmap);
}
});
}
}
把缓存部分,抽取到ImageCache
类里面处理
public class ImageCache {
private LruCache<String,Bitmap> mImageCache;
public ImageCache(){
init();
}
private void init() {
//最大可使用内存
int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
int cacheMemory = maxMemory / 4;
mImageCache = new LruCache<String, Bitmap>(cacheMemory){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight() / 1024 ;
}
};
}
public Bitmap get(String imageUrl){
return mImageCache.get(imageUrl);
}
public void put(String url, Bitmap bitmap) {
mImageCache.put(url,bitmap);
}
}
把ImageLoader
的加载和缓存一分为二,ImageLoader
只负责图片加载的逻辑,而ImageCache
只负责处理图片的缓存逻辑,这样ImageLoader
的代码就变少了,职责更加清晰了,当需要修改缓存相关的代码,不需要改变ImageLoader
类
下一篇:
面向对象基本原则 - 开闭原则
参考资料:
《Android源码设计模式解析与实战》
网友评论