单一职责原则
(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);
}
}
如上为采用“单一职责原则”,配合单例模式的小示例!