你需要了解的行为型设计模式之策略模型

举例情景

实现一个功能有多种方法和策略,我们可以根据不同的情况选择不同的策略,具体一点,比如

  • 电子书阅读的多种动画
  • 文件浏览器的文件多种排列方式
  • 又或者是多种算法

通常做法

一般情况下,我们处理以上的情况时在一个类中实现多种算法,通过不同的命名来区分,调用。

这样做的缺点

  • 一个类中实现多种算法,不符合单一职责
  • 实现具体的算法需要调用具体方法,还会产生多个if else,容易误判,导致逻辑错误
  • 新增方法需要修改代码,有可能改变原有的逻辑结构,不符合对外开放,对内闭合的原则

我们应该怎么做

将算法或者策略抽出来,提供统一接口,不同算法或者不同策略有不同的实现方法,通过动态注入选择策略或者算法,可维护,可扩展性高

适用范围

  • 针对同一问题有多种解决办法,仅仅是具体的行为有所差异
  • 需要封装多种同一类型的操作
  • 一个父类有多个子类,并且需要使用多重if else 或者switch case 时

举例

ImageLoader的加载策略


public class ImageLoader(){

    private ICatetgrey mCategrey;

    //其他代码省略
    public void setCategrey(ICatetgrey categrey){
        this.mCategrey=categrey;
    }
}

接口,公有方法

public interface ICategrey{
    Bitmap getBitmap(String name);
    void putBitmap(String name,Bitmap bitmap);
}

内存缓存

public class LruCache implements ICategrey{
    
    @Override
    public Bitmap getBitmap(String name){
        //略
    }
    
    @Override
    public void putBitmap(String name,Bitmap bitmap){
        //略
    }
    
}

硬盘缓存

public class DiskLruCache implements ICategrey{
    
    @Override
    public Bitmap getBitmap(String name){
        //略
    }
    
    @Override
    public void putBitmap(String name,Bitmap bitmap){
        //略
    }
    
}

使用,可以在硬盘缓存和内存缓存中进行选取

ImageLoader imageLoader=new ImageLoader();
imageLoader.setCategrey(new LruCache());
//imageLoader.setCategrey(new DiskLruCache());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值