定义:一个软件实体如类、模块和函数应该对扩展开放,对修改关闭。
遵循开闭原则设计出的模块具有两个主要特征:
(1)对于扩展是开放的
(2)对于修改是关闭的
白话意思——就是我们改变一个软件时(比如扩展其他功能),应该通过扩展的方式来达到软件的改变,而不应爱修改原有代码来实现变化
优点:
2.开闭原则可以提高复用性
3. 开闭原则可以提高可维护性
通过一个图片缓存来说明开闭原则(本人是根据书上写的想好好熟悉下相关代码,如有雷同请多多包涵)
/**
* 加载图片
*/
public class ImageLoader {
ImageCache mImageCache=new MemoryCache();
ExecutorService mExecutorService= Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
public void setImageCache(ImageCache cache){
mImageCache=cache;
}
public void displayImage(final String imageUrl, final 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;
try {
URL url=new URL(imageUrl);
HttpURLConnection connection= (HttpURLConnection) url.openConnection();
bitmap= BitmapFactory.decodeStream(connection.getInputStream());
connection.disconnect();
}
catch (Exception e){
e.printStackTrace();
}
return bitmap;
}
}
/**
* 缓存基类接口 通过实现这个接口来设置多种缓存
*/
public interface ImageCache {
public Bitmap get(String url);
public void put(String url,Bitmap bitmap);
}
/**
* 内存缓存
*/
public class MemoryCache implements ImageCache{
private LruCache<String ,Bitmap>mMemoryCacle=null;
public MemoryCache(){
initImageCache();
}
private void initImageCache(){
int maxMemory= (int) Runtime.getRuntime().maxMemory();
int cacheSize=maxMemory/4;
mMemoryCacle=new LruCache<String, Bitmap>(cacheSize){
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getHeight()*value.getRowBytes()/1024;
}
};
}
@Override
public Bitmap get(String url) {
return mMemoryCacle.get(url);
}
@Override
public void put(String url, Bitmap bitmap) {
mMemoryCacle.put(url,bitmap);
}
}
/**
* SD卡缓存
*/
public class DiskCache implements ImageCache{
private String cacheDir="sdcard/cache/";
@Override
public Bitmap get(String url) {
return BitmapFactory.decodeFile(cacheDir+url);
}
@Override
public void put(String url, Bitmap bitmap) {
FileOutputStream fileOutputStream=null;
try {
fileOutputStream=new FileOutputStream(cacheDir+url);
bitmap.compress(Bitmap.CompressFormat.PNG,100,fileOutputStream);
fileOutputStream.close();
}
catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 双缓存
*/
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 bitmap) {
mMemoryCache.put(url,bitmap);
mDiskCache.put(url,bitmap);
}
}
//用户使用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageLoader imageLoader=new ImageLoader();
imageLoader.setImageCache(new MemoryCache());
imageLoader.setImageCache(new DiskCache());
imageLoader.setImageCache(new DoubleCache());
imageLoader.setImageCache(new ImageCache() {
@Override
public Bitmap get(String url) {
return null;
}
@Override
public void put(String url, Bitmap bitmap) {
}
});
}
}
Demo下载
学习本无底,前进莫徬徨。