论单一职责原则的使用场景

来源:互联网 发布:怪物猎人ol数据库 编辑:程序博客网 时间:2024/06/05 17:05

    单一职责原则的定义是:就一个类而言,应该仅有一个引起它变化的原因。简单来说,一个类中应该是一组相关性很高的函数,数据封装。就是对职责的定义,什么是类的职责,以及怎么划分类的职责。这是最重要的一环

   

    举个例子做进一步的阐释,做出比较:

  没有采用这种模式的例子:

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.LruCache;import android.widget.ImageView;import java.io.IOException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;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);            try {                final HttpURLConnection conn = (HttpURLConnection) url.openConnection();                bitmap = BitmapFactory.decodeStream(conn.getInputStream());                conn.disconnect();            } catch (IOException e) {                e.printStackTrace();            }        } catch (MalformedURLException e) {            e.printStackTrace();        }        return bitmap;    }}
代码看起来有些杂乱,耦合度比较高,对后期的扩展性,灵活性而言差别较大,后期一旦改动,将会改动很多地方,不利于维护

优化之后,采用单一职责:在功能上一份为二:

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.util.LruCache;import android.widget.ImageView;import java.io.IOException;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class ImageLoader2 {    // 图片缓存    LruCache<String, Bitmap> mImageCache;    // 线程池,线程数量为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);            try {                final HttpURLConnection conn = (HttpURLConnection) url.openConnection();                bitmap = BitmapFactory.decodeStream(conn.getInputStream());                conn.disconnect();            } catch (IOException e) {                e.printStackTrace();            }        } catch (MalformedURLException e) {            e.printStackTrace();        }        return bitmap;    }}
多了imageCache,负责具体的缓存

import android.graphics.Bitmap;import android.util.LruCache;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);    }}

实现缓存和下载图片的功能分离,代码逻辑更加清晰。单一职责就是根据个人的经验,在代码上进行一些优化,让代码逻辑更加清晰,尽量的减少耦合,利于后期维护和扩展。





0 0