单一职责原则(SRP)

SingleResponsibilityPrinciple
一个类只做一件事或者只做某一类事,比如:单例模式。

优化前

  1. /**
  2. * 单一职责原则
  3. * 图片加载类
  4. * 这个类包含图片加载,图片缓存功能,这也是可以优化的地方
  5. */
  6. public class ImageLoader {
  7. // 图片缓存
  8. LruCache<String, Bitmap> mCache;
  9. // 线程池,线程数量为CPU数量
  10. ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
  11. public ImageLoader() {
  12. initImageCache();
  13. }
  14. public void initImageCache() {
  15. // 计算可使用的最大内存
  16. int max = (int) (Runtime.getRuntime().maxMemory() / 1024);
  17. // 取1/4可用内存做缓存
  18. mCache = new LruCache<String, Bitmap>(size) {
  19. @Override
  20. protected int sizeOf(String key, Bitmap value) {
  21. return value.getRowBytes() * value.getHeight() / 1024;
  22. }
  23. };
  24. }
  25. public void displayImage(String url, ImageView imageView) {
  26. imageView.setTag(url);
  27. service.submit(new Runnable() {
  28. @Override
  29. public void run() {
  30. Bitmap bitmap = downloadImage(url);
  31. if (bitmap == null) {
  32. return;
  33. }
  34. if (imageView.getTag().equals(url)) {
  35. imageView.setImageBitmap(bitmap);
  36. }
  37. mCache.put(url, bitmap);
  38. }
  39. });
  40. }
  41. public Bitmap downloadImage(String imgUrl) {
  42. Bitmap bitmap = null;
  43. try {
  44. URL url = new URL(imgUrl);
  45. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  46. bitmap = BitmapFactory.decodeStream(connection.getInputStream());
  47. connection.disconnect();
  48. } catch (Exception e) {
  49. e.printStackTrace();
  50. }
  51. return bitmap;
  52. }
  53. }

优化后

  1. /**
  2. * 单一职责原则
  3. * 图片加载类
  4. */
  5. public class ImageLoader {
  6. // 图片缓存
  7. ImageCache mCache = new ImageCache();
  8. // 线程池,线程数量为CPU数量
  9. ExecutorService service = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
  10. public void displayImage(String url, ImageView imageView) {
  11. Bitmap bitmap = mCache.get(url);
  12. if (null != bitmap) {
  13. imageView.setImageBitmap(bitmpa);
  14. return;
  15. }
  16. imageView.setTag(url);
  17. service.submit(new Runnable() {
  18. @Override
  19. public void run() {
  20. Bitmap bitmap = downloadImage(url);
  21. if (bitmap == null) {
  22. return;
  23. }
  24. if (imageView.getTag().equals(url)) {
  25. imageView.setImageBitmap(bitmap);
  26. }
  27. mCache.put(url, bitmap);
  28. }
  29. });
  30. }
  31. public Bitmap downloadImage(String imgUrl) {
  32. Bitmap bitmap = null;
  33. try {
  34. URL url = new URL(imgUrl);
  35. HttpURLConnection connection = (HttpURLConnection) url.openConnection();
  36. bitmap = BitmapFactory.decodeStream(connection.getInputStream());
  37. connection.disconnect();
  38. } catch (Exception e) {
  39. e.printStackTrace();
  40. }
  41. return bitmap;
  42. }
  43. }
  1. /**
  2. * 图片缓存
  3. **/
  4. public class ImageCache {
  5. LruCache<String,Bitmap> mCache;
  6. public ImageCache() {
  7. initImageCache();
  8. }
  9. public void initImageCache() {
  10. // 计算可使用的最大内存
  11. int max = (int) (Runtime.getRuntime().maxMemory() / 1024);
  12. // 取1/4可用内存做缓存
  13. mCache = new LruCache<String, Bitmap>(size) {
  14. @Override
  15. protected int sizeOf(String key, Bitmap value) {
  16. return value.getRowBytes() * value.getHeight() / 1024;
  17. }
  18. };
  19. }
  20. public Bitmap get(String url) {
  21. return mCache.get(url);
  22. }
  23. public void put(String url,Bitmap bitmap) {
  24. mCache.put(url,bitmap);
  25. }
  26. }

ImageLoader:负责加载图片
ImageCache:负责缓存图片


开闭原则(OCP)

OpenClosePrinciple
类,模块,方法等,对于拓展是开放的,修改是封闭的。


里氏替换原则(LSP)

LiskovSubstitutionPrinciple
只要父类能出现的地方子类就可以出现,而且替换子类也不会产生任何错误或异常,使用者根本不需要知道是父类还是子类。
是否可以理解为Object呢?🤔

设计原则 - 图2

迪米特原则(LOD)

LawOfDemeter
最少知道原则,一个对象对其他对象保持最少的了解。为什么要保持最少的了解呢?因为越来越复杂的类与类之间的关系,导致耦合度高,就会出现动一发儿牵一身。对比发现和单例模式有点像,又有点藕断丝连的感觉呢。


接口隔离原则(ISP)

InterfaceSegregationPrinciple
类与类之间的依赖关系应该建立在最小的接口上。简而言之:抽象抽象再抽象。


依赖倒置原则(DIP)

DependenceInversionPrinciple
抽象不依赖细节,细节依赖抽象,抽象与细节不可本(抽象)末(细节)倒置。
类与类如果直接依赖细节,倒置耦合,限制拓展,应该面向接口或者抽象编程。

  • 高层模块不应该依赖底层模块,两者都应该依赖其抽象
  • 抽象不应该依赖细节
  • 细节应该依赖抽象