开闭原则---图片缓存

定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。

遵循开闭原则设计出的模块具有两个主要特征:

(1)对于扩展是开放的
(2)对于修改是关闭的
白话意思——就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化

优点:

2.开闭原则可以提高复用性
3. 开闭原则可以提高可维护性

通过一个图片缓存来说明开闭原则(本人是根据书上写的想好好熟悉下相关代码,如有雷同请多多包涵)

/**
 * 加载图片
 */
public class ImageLoader {
    //缓存图片
    ImageCache mImageCache=new MemoryCache();//缓存类
    //线程池
    ExecutorService mExecutorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    //注入缓存实现
    public void setImageCache(ImageCache cache){
        mImageCache=cache;

    }
    public void displayImage(final String imageUrl, final 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;
        try {
            URL url=new URL(imageUrl);
            HttpURLConnection connection= (HttpURLConnection) url.openConnection();
            bitmap= BitmapFactory.decodeStream(connection.getInputStream());
        connection.disconnect();
        }
        catch (Exception e){
            e.printStackTrace();
        }
        return bitmap;
    }
}

/**
 * 缓存基类接口  通过实现这个接口来设置多种缓存
 */
public interface ImageCache {
    public Bitmap get(String url);
    public void put(String url,Bitmap bitmap);
}

/**
 * 内存缓存
 */
public class MemoryCache implements ImageCache{
    private LruCache<String ,Bitmap>mMemoryCacle=null;

    public MemoryCache(){
        initImageCache();
    }
    private void initImageCache(){
        //计算可用的内存
        int maxMemory= (int) Runtime.getRuntime().maxMemory();
        //设置最大为内存的1/4
        int cacheSize=maxMemory/4;
        mMemoryCacle=new LruCache<String, Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap value) {
                return value.getHeight()*value.getRowBytes()/1024;
            }
        };
    }
    @Override
    public Bitmap get(String url) {
        return mMemoryCacle.get(url);
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        mMemoryCacle.put(url,bitmap);
    }
}

/**
 * SD卡缓存
 */
public class DiskCache implements ImageCache{
    private  String cacheDir="sdcard/cache/";

    @Override
    public Bitmap get(String url) {
        return BitmapFactory.decodeFile(cacheDir+url);
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        FileOutputStream fileOutputStream=null;
        try {
            fileOutputStream=new FileOutputStream(cacheDir+url);//缓存位置
            bitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
            fileOutputStream.close();
        }
        catch (Exception e){
            e.printStackTrace();
        }


    }
}

/**
 * 双缓存
 */
public class DoubleCache implements ImageCache{
    ImageCache mMemoryCache=new MemoryCache();
    ImageCache mDiskCache=new DiskCache();

    //先内存缓存中获取图片 如果没有从sd卡获取
    @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 bitmap) {
        mMemoryCache.put(url,bitmap);
        mDiskCache.put(url,bitmap);
    }
}

//用户使用

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ImageLoader imageLoader=new ImageLoader();
        //使用内存
        imageLoader.setImageCache(new MemoryCache());
        //使用sd
        imageLoader.setImageCache(new DiskCache());
        //使用双缓存
        imageLoader.setImageCache(new DoubleCache());
        //自定义缓存
        imageLoader.setImageCache(new ImageCache() {
            @Override
            public Bitmap get(String url) {
                return null;
            }

            @Override
            public void put(String url, Bitmap bitmap) {

            }
        });
    }
}

Demo下载

学习本无底,前进莫徬徨。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值