您好,欢迎来到二三四教育网。
搜索
您的当前位置:首页android面向对象的六大原则之 —— 迪米特原则

android面向对象的六大原则之 —— 迪米特原则

来源:二三四教育网

版权声明:本文为博主原创文章,未经博主允许不得转载。


importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.util.LruCache;
importandroid.widget.ImageView;

importjava.io.IOException;



importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;

/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageLoader{

publicImageLoader(){
}

//图片缓存类
ImageCacheimageCache=newImageCache();
//线程池,线城数量为cpu的数量
ExecutorServicemExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

/**
*显示图片
*@paramurl图片的url
*@paramimageView要显示的view
*/
publicvoiddisplayImage(finalStringurl,finalImageViewimageView){
Bitmapbitmap=imageCache.get(url);
if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
mExecutorService.submit(newRunnable(){
@Override
publicvoidrun(){
Bitmapbitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
imageCache.put(url,bitmap);
}
});
}
/**
*下載圖片
*@paramimageUrl网络图片地址
*@return返回bitmap对象
*/
publicBitmapdownloadImage(StringimageUrl){
Bitmapbitmap=null;
try{
URLurl=newURL(imageUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbitmap;
}
}

ImageCache类

importandroid.graphics.Bitmap;
importandroid.util.LruCache;

/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageCache{

publicImageCache(){
//初始化图片缓存
initImageCache();
}

//图片缓存类
LruCache<String,Bitmap>imageCache;

/**
*初始化缓存
*/
privatevoidinitImageCache(){
//计算可使用的最大内存
intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
//只用最大内存的四分之一作为缓存大小
intcacheSize=maxMemory/4;
imageCache=newLruCache<String,Bitmap>(cacheSize){
@Override
protectedintsizeOf(Stringkey,Bitmapvalue){
returnvalue.getRowBytes()*value.getHeight()/1024;
}
};
}

/**
*添加缓存
*
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap){
imageCache.put(url,bitmap);
}

/**
*获取缓存的图片
*
*@paramurl
*@return
*/
publicBitmapget(Stringurl){
Bitmapbitmap=null;
bitmap=imageCache.get(url);
returnbitmap;
}
}

你会发现,我们的Imageloader在实现缓存的时候,就需要直接跟缓存类ImageCache打交道。
我们想一下,给个代理商的类
这个代理商类,我们就直接命名为ImageCache,所以,ImageCache现在的内容如下


importandroid.graphics.Bitmap;

/**
*CreatedbyAdministratoron2016/3/1.
*/
publicinterfaceImageCache{
/**
*添加缓存
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap);

/**
*获取缓存的图片
*@paramurl
*@return
*/
publicBitmapget(Stringurl);
}

ImageCache只需要作为你的iphone手机跟厂商的桥梁,而现在的厂商是ImageLoader,它直接跟代理商ImageCache打交道

importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.widget.ImageView;

importjava.io.IOException;



importjava.util.concurrent.ExecutorService;
importjava.util.concurrent.Executors;

/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassImageLoader{

publicImageLoader(){
}

//默认使用内存缓存
ImageCacheimageCache=newMemoryCache();

//线程池,线城数量为cpu的数量
ExecutorServicemExecutorService=Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

/**
*设置要使用哪种缓存
*@paramimageCache缓存类
*/
publicvoidsetImageCache(ImageCacheimageCache){
this.imageCache=imageCache;
}

/**
*显示图片
*@paramurl图片的url
*@paramimageView要显示的view
*/
publicvoiddisplayImage(finalStringurl,finalImageViewimageView){
Bitmapbitmap=imageCache.get(url);

if(bitmap!=null){
imageView.setImageBitmap(bitmap);
return;
}
imageView.setTag(url);
mExecutorService.submit(newRunnable(){
@Override
publicvoidrun(){
Bitmapbitmap=downloadImage(url);
if(bitmap==null){
return;
}
if(imageView.getTag().equals(url)){
imageView.setImageBitmap(bitmap);
}
//添加到缓存
imageCache.put(url,bitmap);
}
});
}

/**
*下載圖片
*@paramimageUrl网络图片地址
*@return返回bitmap对象
*/
publicBitmapdownloadImage(StringimageUrl){
Bitmapbitmap=null;
try{
URLurl=newURL(imageUrl);
HttpURLConnectionconn=(HttpURLConnection)url.openConnection();
bitmap=BitmapFactory.decodeStream(conn.getInputStream());
conn.disconnect();
}catch(MalformedURLExceptione){
e.printStackTrace();
}catch(IOExceptione){
e.printStackTrace();
}
returnbitmap;
}
}

这个时候,我们只需要建立一个实现了ImageCache接口的实现类,也就是买了iphone100的你自己

importandroid.graphics.Bitmap;
importandroid.util.LruCache;

/**
*CreatedbyAdministratoron2016/3/1.
*/
publicclassMemoryCacheimplementsImageCache{

publicMemoryCache(){
//初始化图片缓存
initImageCache();
}

//图片缓存类
LruCache<String,Bitmap>memoryCache;

/**
*初始化缓存
*/
privatevoidinitImageCache(){
//计算可使用的最大内存
intmaxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
//只用最大内存的四分之一作为缓存大小
intcacheSize=maxMemory/4;
memoryCache=newLruCache<String,Bitmap>(cacheSize){
@Override
protectedintsizeOf(Stringkey,Bitmapvalue){
returnvalue.getRowBytes()*value.getHeight()/1024;
}
};
}

/**
*添加缓存
*
*@paramurl缓存的图片url作为缓存的key
*@parambitmap缓存的bitmap
*/
publicvoidput(Stringurl,Bitmapbitmap){
memoryCache.put(url,bitmap);
}

/**
*获取缓存的图片
*
*@paramurl
*@return
*/
publicBitmapget(Stringurl){
Bitmapbitmap=null;
bitmap=memoryCache.get(url);
returnbitmap;
}
}

这样,我们就实现了迪米特原则,一个对象应该对其他对象有最少的了解,即两个类之间没有直接关系,也就降低了耦合度,在需要添加一个卖肾买iphone的人的时候,只需要实现ImageCache接口,就能实现保修。
对于上面的解释你可能会比较迷糊,我专业点解释一下,其实就是,我们这个ImageLoader图片加载器原先在实现缓存的时候,是直接跟缓存类ImageCache打交道的,也就说明了,一但我们需要添加新的缓存方式,我们就需要更改ImageLoader里面的代码,这样明显的说明了,两个类之间是有直接关系的,而迪米特原则就是,不要有直接关系,或者说,关系越小越好,所以,我们拆开来,搞了一个中间的接口ImageCache,而真正的实现缓存的MemoryCache内存缓存类,实现了ImageCache接口,在ImageLoader中,我们只需要使用ImageCache接口就行,这样,用户在使用哪一种缓存的时候,只要实现ImageCache接口就能实现自己想要的缓存方式,而且还不需要修改ImageLoader类里面的代码,只需要通过调用ImageLoader里面的

/**
*设置要使用哪种缓存
*@paramimageCache缓存类
*/
publicvoidsetImageCache(ImageCacheimageCache){
this.imageCache=imageCache;
}

这个方法就能通过依赖注入的方式,选择自己想要使用的缓存方式。

Copyright © 2019- how234.cn 版权所有 赣ICP备2023008801号-2

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务