开闭原则是Java中最基础的设计原则,定义为:软件中的类,模块,函数等,应该是对于扩展是开放的,对于修改是封闭的,在软件的生命周期中,因为变化,升级和维护等原因修改原来代码时,可能会将错误传递到原有系统中,因此需要通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。
举例子:
让用户自己实现缓存方式的选择,下面直接上代码:
public interface ImageCache { public Bitmap get(String url); public void put(String url,Bitmap bmp); }
下面无论是内存缓存,sd卡缓存,还是线程池下载缓存,都会实现上面接口,做一些处理。实现统一
public class DiskCache implements ImageCache { @Override public Bitmap get(String url) { return null; } @Override public void put(String url, Bitmap bmp) { // 将bitmap写入文件中 } }
public class MemoryCache implements ImageCache{ private LruCache<String,Bitmap> mMemoryCache; public MemoryCache(){ // 初始化lru缓存 } @Override public Bitmap get(String url) { return mMemoryCache.get(url); } @Override public void put(String url, Bitmap bmp) { mMemoryCache.put(url,bmp); } }
public class DoubleCache implements ImageCache { ImageCache mMemoryCache = new MemoryCache(); ImageCache mDiskCache = new DiskCache(); @Override public Bitmap get(String url) { Bitmap bitmap = mMemoryCache.get(url); if (bitmap == null) { bitmap = mDiskCache.get(url); } return bitmap; } @Override public void put(String url, Bitmap bmp) { mMemoryCache.put(url,bmp); mDiskCache.put(url,bmp); } }
然后实现整体功能,图片下载功能。
public class ImageLoader { ImageCache mImageCache = new MemoryCache(); ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors()); public void setImageCache(ImageCache cache){ mImageCache = cache; } public void displayImage(String imageUrl,ImageView imageView){ Bitmap bitmap = mImageCache.get(imageUrl); if (bitmap !=null){ imageView.setImageBitmap(bitmap); return; } submitLoadRequest(imageUrl,imageView); } private void submitLoadRequest(final String imageUrl,final ImageView imageView){ imageView.setTag(imageUrl); mExecutorService.submit(new Runnable() { @Override public void run() { Bitmap bitmap = downloadImage(imageUrl); if (bitmap == null){ return; } if (imageView.getTag().equals(imageUrl)){ imageView.setImageBitmap(bitmap); } mImageCache.put(imageUrl,bitmap); } }); } public Bitmap downloadImage(String imageUrl){ Bitmap bitmap = null; URL url = null; try { url = new URL(imageUrl); final HttpURLConnection conn = (HttpURLConnection) url.openConnection(); bitmap = BitmapFactory.decodeStream(conn.getInputStream()); conn.disconnect(); } catch (Exception e) { e.printStackTrace(); } return bitmap; } }
这样整体的结构非常清晰,明确,而且具有很强的可扩展性,耦合度也比较低。