面向对象的六大原则-以ImageLoader为例

一、六大原则分为一下六个:

  1. 单一职责原则(Single Responsibility Principle,缩写是SRP)
  2. 开闭原则(Open Close Principle,缩写是OCP)
  3. 里氏替换原则(Liskov Substitution Principle,缩写是LSP)
  4. 依赖倒置原则(Dependence Inversion Principle,缩写是DIP)
  5. 接口隔离原则(Interface Segregation Principle,缩写是ISP)
  6. 迪米特原则(Law of Demeter,缩写是LOD,也是最少知识原则(Least Knowledge Principle))

二、单一职责原则介绍
SRP的定义是:就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数、数据的封装。

/**
 * 图片类加载
 */
public class ImageLoader {

    //图片缓存
    LruCache<String,Bitmap> mImageCache;
    //线程池,线程数量为CPU的数量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    public ImageLoader(){
        initImageCache();
    }
    private void initImageCache(){
        //计算可使用的最大内存
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024);
        //取四分之一的可用内存作为缓存
        final int cacheSize = maxMemory/4;
        mImageCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes()*bitmap.getHeight()/1024;
            }
        };
    }
    public void displayImage(final String url, final ImageView imageView){
        imageView.setTag(url);
        mExecutorService.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);
            }
        });
    }
    public Bitmap downloadImage(String imageUrl){
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        }catch (Exception e){
            e.printStackTrace();
        }
        return bitmap;
    }
}

这些是最开始设计时候的代码,不知道大家有没有看出有什么不妥的地方。
这片代码是没有任何设计可说的,更不能说它的扩展性和灵活性了,耦合也非常严重,不过刚工作的时候,大家可能会用这种方法来实现。
单一职责原则说简单点,也就是把各个功能独立出来。
接下来我把ImageLoader分为了两步,ImageLoader负责加载图片逻辑,ImageCache负责处理图片缓存逻辑,代码修改如下:

ImageLoader类
/**
 * 图片类加载
 */
public class ImageLoader {

    ImageCache mImageCache = new ImageCache();
    //线程池,线程数量为CPU的数量
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());

    public void displayImage(final String url, final ImageView imageView){
        imageView.setTag(url);
        mExecutorService.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);
            }
        });
    }
    public Bitmap downloadImage(String imageUrl){
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            final HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        }catch (Exception e){
            e.printStackTrace();
        }
        return bitmap;
    }
ImageCache类
public class ImageCache {
    //图片缓存
    LruCache<String,Bitmap> mImageCache;
    public ImageCache(){
        initImageCache();
    }
    private void initImageCache(){
        //计算可使用的最大内存
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory()/1024);
        //取四分之一的可用内存作为缓存
        final int cacheSize = maxMemory/4;
        mImageCache = new LruCache<String,Bitmap>(cacheSize){
            @Override
            protected int sizeOf(String key, Bitmap bitmap) {
                return bitmap.getRowBytes()*bitmap.getHeight()/1024;
            }
        };
    }
    public void put(String url, Bitmap bitmap){
        mImageCache.put(url,bitmap);
    }
    public Bitmap get(String url){
        return mImageCache.get(url);
    }
}

上面两步是把完全不一样的功能分开,这样就满足了单一职责原则。

博主也是学习了后,不知道写什么例子,就写了爱哥的例子,也是看了所有体会,觉得在开发中非常重要,就写了六大原则的博客,有不足之处希望大家见谅!
下一篇博客为大家介绍开闭原则

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值