Android设计模式——开闭原则

开闭原则

开闭原则——Open Close Principle OCP

定义:软件中的对象(类、函数、模块)应该对于扩展是开放的,但是,对于修改是封闭的。在软件的生命周期内,因为变化、升级和维护等原因需要对软件原有代码进行修改时,可能会将错误引入原本已经经过测试的代码中,破坏原有系统,因此,当软件需要变化时,我们尽量通过扩展的方式来实现变化。而不是通过修改已有代码来实现。

示例代码:
  • Android中的图片加载策略分为 缓存策略 磁盘策略 在使用中是比较典型的开闭原则的应用,使用各种各样的缓存策略时不应该修改程序代码,而应该使用扩展的方式去实现

  • ImageLoader 类



/**
 * Describe:图片加载工具类
 * 运用开闭原则,通过拓展的方式实现修改与变化,对于源代码只在处理错误的时候才进行修改
 * wx on 2016/12/27.
 */
public class ImageLoader {

    // TODO:图片缓存
    ImageCache mImageCache = new MemoryCache();
    // TODO: 线程池
    ExecutorService mExecutorService = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
    // TODO: 注入缓存实现

    public void setImageCache(ImageCache imageCache) {
        mImageCache = imageCache;
    }

    public void displayImage(String imageUrl, ImageView mImageView) {
        Bitmap bitmap = mImageCache.get(imageUrl);
        if (bitmap != null) {
            mImageView.setImageBitmap(bitmap);
            return;
        }
        // TODO: 图片没缓存,启动线程下载图片
        submitLoadRequest(imageUrl, mImageView);
    }

    /**
     * 下载图片动作
     *
     * @param imageUrl   图片地址
     * @param mImageView 要加载的图片view
     */
    private void submitLoadRequest(final String imageUrl, final ImageView mImageView) {
        // TODO: 标记设置
        mImageView.setTag(imageUrl);
        // TODO: 启动线程池执行
        mExecutorService.submit(new Runnable() {
            @Override
            public void run() {
                Bitmap bitmap = downloadImage(imageUrl);
                if (bitmap == null) {
                    return;
                }
                if (mImageView.getTag().equals(imageUrl)) {
                    mImageView.setImageBitmap(bitmap);
                }
                // TODO: 缓存图片
                mImageCache.put(imageUrl,bitmap);
            }
        });
    }

    /**
     * 下载图片具体实现
     *
     * @param imageUrl
     * @return
     */
    private Bitmap downloadImage(String imageUrl) {
        Bitmap bitmap = null;
        try {
            URL url = new URL(imageUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            bitmap = BitmapFactory.decodeStream(conn.getInputStream());
            conn.disconnect();
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return bitmap;
    }
}

  • 该类ImageLoader通过setImageCache(ImageCache cache)方法注入不同的缓存实现,可以使得ImageLoader简单健壮。也使得ImageLoader的可拓展性、灵活性更高。

  • ImageCache 接口

  • 该接口抽象了实现缓存的方法 设置缓存和读取缓存的方法

/**
 * Describe: 图片缓存接口
 * wx on 2016/12/27.
 */
public interface ImageCache {
    /**
     * 设置图片方法
     *
     * @param url
     * @return
     */
    Bitmap get(String url);

    /**
     * 取出图片方法
     *
     * @param url    地址
     * @param bitmap 存储的图片
     */
    void put(String url, Bitmap bitmap);

}
  • 内存缓存实现类
/**
 * Describe:内存缓存实现类 继承图片缓存接口
 * wx on 2016/12/27.
 */

public class MemoryCache implements ImageCache {
    // TODO: LRU缓存集合
    private LruCache<String, Bitmap> mMemeryCache;

    /**
     * 初始化内存缓存方法
     */
    public MemoryCache() {
    }

    @Override
    public Bitmap get(String url) {
        // TODO: 取图片时从集合中根据相应的url从集合中取出
        return mMemeryCache.get(url);
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        // TODO: 存储图片缓存时放入集合中
        mMemeryCache.put(url, bitmap);

    }

}
  • SD卡缓存实现类

/**
 * Describe:磁盘缓存
 * wx on 2016/12/27.
 */
public class DiskCache implements ImageCache {

    @Override
    public Bitmap get(String url) {
        // TODO: 从本地文件中获取图片
        return null;
    }

    @Override
    public void put(String url, Bitmap bitmap) {
        // TODO: 将Bitmap写入到本地文件中
    }
}
  • 双缓存实现类

/**
 * Describe:双缓存类 先从内存中取图片,内存中没有从本地取图片
 * wx on 2016/12/27.
 */
public class DoubleCache implements ImageCache {
    // TODO: 构造内存缓存
    MemoryCache mMemorycache = new MemoryCache();
    DiskCache 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) {
        // TODO: 将图片缓存到内存和SDcard中
        mMemorycache.put(url, bitmap);
        mDiskCache.put(url, bitmap);
    }
}

总结

开闭原则指导我们,当软件需要变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值