1_单一职责原则

单一职责原则

(Si ngle Responsibility Principle, SRP)

参考《Android 源码设计模式》


  • 一个类中应该是对一组相关性很高的函数、变量封装。
  • 对责任的定义;怎么划分职责:面向对象,各司其职。

错误示例: ImageLoader 既有展示图片的职责,也有缓存职责。

public class ImageLoader1 {

    /* 成员变量:处理缓存(不应该属于 ImageLoader 的成员) */
    private static LruCache<String,Bitmap> mLruCache = new LruCache<String,Bitmap>((int) (Runtime.getRuntime().maxMemory() / 4)) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return bitmap.getRowBytes() * bitmap.getHeight();
        }
    };

    /** 对外调用,使用展示网络图片 */
    public void display(final String url, final ImageView imageView) {
        Bitmap bitmap = mLruCache.get(url);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            OkGo.<Bitmap>get(url)
                    .tag(this)
                    .execute(new BitmapCallback() {
                        @Override
                        public void onSuccess(Response<Bitmap> response) {
                            Bitmap body = response.body();
                            imageView.setImageBitmap(body);
                            mLruCache.put(url, body);
                        }
                    });
        }
    }
}

正确示例:将“展示图片” & “缓存职责”分离

public class ImageCache {

    private static LruCache<String,Bitmap> mLruCache = new LruCache<String,Bitmap>((int) (Runtime.getRuntime().maxMemory() / 4)) {
        @Override
        protected int sizeOf(String key, Bitmap bitmap) {
            return bitmap.getRowBytes() * bitmap.getHeight();
        }
    };

    /** 私有构造,因单例 */
    private ImageCache() {}

    /** 对外接口,获取该类的实例(单例) */
    public static ImageCache getInstance() {
        return InstanceHolder.sInstance;

    /** 从缓存中获取图片*/
    public Bitmap getBitmap(String key) {
        return mLruCache.get(key);
    }

    /** 缓存图片*/  
    public void setBitmap(String key, Bitmap bitmap) {
        mLruCache.put(key, bitmap);

    /** 类如其名:持有外部类静态实例(仅在类被第一次夹在的时候初始化) */  
    private static class InstanceHolder {
        private static ImageCache sInstance = new ImageCache();
    }
}

public class ImageLoader2 {

    private ImageCache mImageCache = ImageCache.getInstance();

    public static ImageLoader2 getInstance() {
        return InstanceHolder.sInstance;
    }

    /** 对外调用,使用展示网络图片 */
    public void display(final String url, final ImageView imageView) {
        Bitmap bitmap = mImageCache.getBitmap(url);
        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            OkGo.<Bitmap>get(url)
                    .tag(this)
                    .execute(new BitmapCallback() {
                        @Override
                        public void onSuccess(Response<Bitmap> response) {
                            Bitmap body = response.body();
                            imageView.setImageBitmap(body);
                            mImageCache.setBitmap(url, body);
                        }
                    });
        }
    }

    private static class InstanceHolder {
        private static ImageLoader2 sInstance = new ImageLoader2();
    }
}

public class ClientActivity extends Activity {

    private ImageView mImageView;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_client);

        mImageView = (ImageView) findViewById(R.id.image);

        ImageLoader2.getInstance().display("http://127.0.0.1:8080/wahaha.png", mImageView);
    }
}

如上为采用“单一职责原则”,配合单例模式的小示例!

猜你喜欢

转载自blog.csdn.net/wq316476051/article/details/74783307