面向对象基本原则 - 单一职责

2018-05-19  本文已影响17人  wenou

让代码变得简洁,清晰
让项目变得更加灵活,更加稳定,有更好的扩展性

单一职责 - (优化代码第一步)

单一职责的定义: 对一个类而言,应该只能有一个引起它变化的原因.一个类应该是一组相关性很高的函数,数据的封装

也就是说一个类应该只负责一件事情: 如果一个类负责了方法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源码设计模式解析与实战》

上一篇 下一篇

猜你喜欢

热点阅读