一、六大原则分为一下六个:
- 单一职责原则(Single Responsibility Principle,缩写是SRP)
- 开闭原则(Open Close Principle,缩写是OCP)
- 里氏替换原则(Liskov Substitution Principle,缩写是LSP)
- 依赖倒置原则(Dependence Inversion Principle,缩写是DIP)
- 接口隔离原则(Interface Segregation Principle,缩写是ISP)
- 迪米特原则(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);
}
}
上面两步是把完全不一样的功能分开,这样就满足了单一职责原则。
博主也是学习了后,不知道写什么例子,就写了爱哥的例子,也是看了所有体会,觉得在开发中非常重要,就写了六大原则的博客,有不足之处希望大家见谅!
下一篇博客为大家介绍开闭原则