首先看下概念对于一个Java类而言只有一个引起变化的原因也可以说一组相关性很高的函数数据的封装
场景A某公司为了让刚来的小伟进行锻炼下,主管把小伟叫到办公室说,小伟你也来了一个月了,应该自己对公司的源码有一定的了解,磨刀不误砍柴工,是驴子是
.-' _..`.
/ .'_.'.'
| .' (.)`.
;' ,_ `.
.–.____.’ ; .;-'
..’`-._ _, ..’
| ./ /
| | /
/ | | | |\ \
/ /| | | | \ \
/ / | | | | \ \
// || |_| _\
|\ |\ |\ |\拿出去遛遛,感觉工作怎么样,今天交给你一个小任务,实现一个图片缓存加载器
经过一番思考,小伟分析了一下需求,下面开始撸码了。
public class ImageLoader{
//图片缓存
LruCache<String,Bitmap> mImageCache;
//线程池,线程数量为cpu的数量
ExecutorService mExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public ImageLoader(){
initImageCache();
}
private void initImageCache(){
//计算最大可用内存
final int maxMemory=(int)(Runtime.getRuntime.maxMemory()/1024);
//取1/4的可用内存作为缓存
final int cacheSize=maxMemory/4;
mImageCache=new LruCache<String,Bitmap>(cacheSize){
@override
protected int sizeOf(String key,Bitmap Bitmap){
return bitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};
}
public void displayImageView(final String url,final ImageView imageView){
imageView.setTag(url);
mExecutorService.submit(new Runnable()){
@override
public void run(){
Bitmap bitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
import junit.framework.TestCase;
.setImageBitmap(bitmap);
}
mImageCache.put(url,bitmap);
}
});
}
public Bitmap downloadImage(String imageUrl){
Bitmap bitmap=null;
try{
URL url=new URL(imageUrl);
final HttpURLConnection conn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}catch(Exception e){
e.printStackTrace();
}
return bitmap;
}
}
}
最后你猜猜主管是表扬了小伟还是怎么的?哈哈
从上面的代码可以看出他把所有的功能都放在一个类,可能实现一个功能是可以,但是随着业务逻辑的复杂性,这样玩肯定是不行的,这样的代码相信不仅仅是小伟写出出来,生活中很多程序员应该都会犯这种错误尤其是初级开发人员,之前我也犯过哈哈,不过没事有人批您的代码总是好的,最后小伟被主管狠狠的批了一顿,代码耦合性太高,没有任何优化而言,然后主管看着他很无奈的说:“你还是把Code拆分一下让他们满足单一原则”主观的这句话惊醒了小伟,小伟经历这次之后回去花了UML图
对代码进行一次重构,
结果如下
public class ImageCache{
//图片LRU缓存
LruCache<String,Bitmap> mImageCache;
public ImageCache(){
initImageCache();
}
private void initImageCache() {
//计算最大内存数
final int maxMemory=((int)Runtime.getRuntime().maxMemory()/1024);
//取1/4的可用内存作为缓存
final int cacheSize=maxMemory/4;
mImageCache=new LruCache<String,Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes()*bitmap.getHeight()/1024;
}
};
}
public void put(String url,Bitmap bitmap){
mImageCache.put(url,bitmap);
}
public Bitmap get(String url){
return mImageCache.get(url);
}
}
//图片
ImageCache imageCache=new ImageCache();
ExecutorService mExecutorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public void displayImageView(final String url, ImageView imageView){
Bitmap bitmap=imageCache.get(url);
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
imageView.setTag(url);
mExecutorService.submit(new Runnable() {
@Override
public void run() {
Bitmap bitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
imageCache.put(url,bitmap);
}
});
}
public Bitmap downloadImage(String imgUrl) {
Bitmap bitmap=null;
try {
URL url=new URL(imgUrl);
HttpURLConnection conn= (HttpURLConnection) url.openConnection();
bitmap= BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return bitmap;
}
经历这次重构之后小伟感觉收获很多,虽然主管只是说有进度,但对于小伟而言已经迈向代码优化的第一步,万事开头难,最后主管说如果要是扩展一下就更好了,如果我要实现图片加载只要改图片加载的逻辑,而不会影响到图片缓存的逻辑,说白了就是让耦合性降低!满足软件设计的原则。下次将开闭原则敬请期待哈哈!