图片下载的开闭原则(ocp)实现

开闭原则是Java中最基础的设计原则,定义为:软件中的类,模块,函数等,应该是对于扩展是开放的,对于修改是封闭的,在软件的生命周期中,因为变化,升级和维护等原因修改原来代码时,可能会将错误传递到原有系统中,因此需要通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。

举例子:

让用户自己实现缓存方式的选择,下面直接上代码:

public interface ImageCache {
    public Bitmap get(String url);
    public void put(String url,Bitmap bmp);

}

下面无论是内存缓存,sd卡缓存,还是线程池下载缓存,都会实现上面接口,做一些处理。实现统一

public class DiskCache implements ImageCache {

    @Override
    public Bitmap get(String url) {
        return null;
    }

    @Override
    public void put(String url, Bitmap bmp) {
        // bitmap写入文件中
    }

}

public class MemoryCache implements ImageCache{

    private LruCache<String,Bitmap> mMemoryCache;

    public MemoryCache(){
        // 初始化lru缓存
    }

    @Override
    public Bitmap get(String url) {
        return mMemoryCache.get(url);
    }

    @Override
    public void put(String url, Bitmap bmp) {
        mMemoryCache.put(url,bmp);
    }
}

public class DoubleCache implements ImageCache {
    ImageCache mMemoryCache = new MemoryCache();
    ImageCache mDiskCache = new DiskCache();


    @Override
    public Bitmap get(String url) {
        Bitmap bitmap = mMemoryCache.get(url);
        if (bitmap == null) {
            bitmap = mDiskCache.get(url);
        }
        return bitmap;
    }

    @Override
    public void put(String url, Bitmap bmp) {
        mMemoryCache.put(url,bmp);
        mDiskCache.put(url,bmp);
    }

}

然后实现整体功能,图片下载功能。


public class ImageLoader {

    ImageCache mImageCache = new MemoryCache();
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    public void setImageCache(ImageCache cache){
        mImageCache = cache;
    }

    public void displayImage(String imageUrl,ImageView imageView){
        Bitmap bitmap = mImageCache.get(imageUrl);
        if (bitmap !=null){
            imageView.setImageBitmap(bitmap);
            return;
        }
        submitLoadRequest(imageUrl,imageView);
    }

    private void submitLoadRequest(final String imageUrl,final ImageView imageView){
        imageView.setTag(imageUrl);
        mExecutorService.submit(new Runnable() {
            @Override
            public void run() {
           Bitmap bitmap = downloadImage(imageUrl);
                if (bitmap == null){
                    return;
                }
                if (imageView.getTag().equals(imageUrl)){
                 imageView.setImageBitmap(bitmap);
                }
                mImageCache.put(imageUrl,bitmap);
            }
        });
    }

    public Bitmap downloadImage(String imageUrl){
        Bitmap bitmap = null;
        URL url = null;
        try {
            url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (Exception e) {
            e.printStackTrace();
        }
       return bitmap;
    }
}


这样整体的结构非常清晰,明确,而且具有很强的可扩展性,耦合度也比较低。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值