美文网首页
面向对象基本原则 - 单一职责

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

作者: wenou | 来源:发表于2018-05-19 10:28 被阅读17次

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

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

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

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

相关文章

  • 面向对象设计的基本原则

    面向对象的基本特征:封装,继承,多态。面向对象设计的基本原则: 1.单一职责原则 一个类只有一种职责或功能,只有一...

  • java核心技术笔记

    第一章、面向对象五大基本原则 SOLID原则 1.1 单一职责 参考:https://www.jianshu.co...

  • 1.1、面向对象

    一、面向对象面向对象的三大特征:封装、继承、多态。 五大基本原则:单一职责原则(每个类只做一件事)、开放封闭原则(...

  • Java

    JAVA基础 面向对象的特征 基本原则1.1 继承、封装和多态1.2 单一职责原则 开放封闭原则 替换原则 依赖原...

  • Android 开发原则

    面向对象的五大基本原则单一职责原则(SRP)开放封闭原则(OCP)里氏替换原则(LSP)依赖倒置原则(DIP)接口...

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

    让代码变得简洁,清晰让项目变得更加灵活,更加稳定,有更好的扩展性 单一职责 - (优化代码第一步) 单一职责的定...

  • 面向对象的六大原则之单一职责原则

    单一职责原则(SRP)又称单一功能原则,为面向对象六大基本原则之一。 我们先来看一下官方是如何描述该原则的: ...

  • 面向对象基本原则 - 开闭原则

    开闭原则 - (让程序更稳定,更灵活) 上一篇:面向对象基本原则 - 单一职责 开闭原则是java里最基础的设计原...

  • 单一职责原则

    单一职责原则(SRP:Single responsibility principle)又称单一功能原则,面向对象五...

  • 面向对象设计

    概述 7 种常用的面向对象设计原则 1、单一职责原则 单一职责原则(Single Responsibility P...

网友评论

      本文标题:面向对象基本原则 - 单一职责

      本文链接:https://www.haomeiwen.com/subject/epdodftx.html