新模式以及设计模式比较

规格模式

        从多个对象中查找满足条件的对象,查找条件往往不固定,可将查找条件抽离成单独的规格类,由使用者自行编写、传入。查找条件往往有与、或、非操作,所以可以使用组合模式。基本类如下:


        ISpecification为所有查询条件的根父类,为一接口,只有一个方法

public interface ISpecification<T> {
    /**
     * 用于判断当前传入的t是否满足查询条件
     */
    boolean isSatisfiedBy(T t);
}

        其中Provider为查询类,客户端在使用时传入数据源以及规格类,返回的就是数据源中满足规格类的数据。如下:

public class Provider<T> {
    public  ArrayList<T> findSatisfied(ISpecification<T> specification,ArrayList<T> src){
        ArrayList<T> result = new ArrayList<>();
        for(T t : src){
            if(specification.isSatisfiedBy(t)){
                result.add(t);
            }
        }
        return result;
    }
}

        ISingleSpecification与AbsCompisiteSpecification分别为单个查找条件和多个查询条件共同作用的父类。其中AndCompisiteSpecificaion与OrCompisiteSpefication都继承于AbsCompisiteSpecification。如下:

public class AndCompositeSpecification<T> extends AbsCompositeSpecification<T> {

    public AndCompositeSpecification(ISpecification<T> left, ISpecification<T> right) {
        super(left, right);
    }

    @Override
    public boolean isSatisfiedBy(T t) {
        return super.left.isSatisfiedBy(t) && super.right.isSatisfiedBy(t);//OrCompositeSpecification将&&换成||
    }
}

        如果想实现一个满足规格A但不满足规格B的规格类,只需要继承AbsCompisiteSpecification,并重写isSatisfiedBy()方法,编写自己的规格逻辑即可。

        LengthSpecification与StartSpecificaion实现ISingleSpecification,表示单一的查询条件。如下:

public class LengthSpecification implements ISingleSpecification<String> {
    private int len;

    public LengthSpecification(int len) {
        this.len = len;
    }

    @Override
    public boolean isSatisfiedBy(String o) {
        return o.length() > len;
    }
}

        如果长度大于len,则该string满足条件。而StartSpecificaion与此类似,只不过它判断的是否以某个字符串开头。如果想写自己的逻辑——比如长度小于某个数值,只需要实现ISingleSpecification,并在isSatisfiedBy()中重写自己的逻辑即可。

使用起来很简单:

        ArrayList<String> list = makeStr();
        Log.e(TAG,"前list = "+list.toString());
        ISpecification<String> start = new StartSpecificaion("a");//以字符串a开头
        ISpecification<String> len = new LengthSpecification(3);//长度大于3
        //定义一个Provider,并传入规格以及数据源
        list = new Provider<String>().findSatisfied(new OrCompositeSpecification<>(len,start),list);
        Log.e(TAG,"后 list = "+list.toString());

工厂方法与建造者

        工厂方法专注于整体的创建,创建出来的对象完全相同。如BitmapFactory,调用其中的方法直接返回一个Bitmap,而无法对Bitmap进行任何的设置。

        建造者,专注于细节的构建以及组装顺序,通过一个部件一个部件的构造,精确的创建出一个复杂对象,并且对象完全不同。如AlertDialog.Builder,可以使用它设置title、message等,build出来的自个dialog对象不相同。

        工厂模式是粗线条的创建一个对象——无法定制各个细节,得到的产品基本相同;而建造者模式是细腻地构建一个对象——可以定制各个细节、组装顺序。

代理模式与装饰模式

        代理模式:偏重于对访问的控制,如是否可以访问到被代理类的相应方法(在某些条件下可以不访问被代理类的方法),传入被代理类的参数是否经过代理类的处理,但它保证对代理类的功能不进行任何增强或减弱。

        装饰模式:偏重于对被装饰者功能的增强或减弱。它不决定被装饰的方法是否执行,也不对传入该方法的参数进行任何过滤,它只是增加或减弱被装饰者的功能。

策略模式与命令模式

        策略模式:将各个策略封装成单独的类,并能相互替换,着重于策略类的互相替换。如排序算法中各个实现方法,它们是完全不相关的、可替换的,使用任何方法都可以达到目的。

       命令模式:将发起者的请求封装成单独的命令类,并使用管理类对这些命令类进行管理,再在命令类中调用具体的处理者进行处理,达到将发起者与处理者解耦的目的。它着重于将命令的封装以及对命令的撤销与恢复。例如登录界面中的注册、忘记密码、登录就是命令;而登录中的qq登录、微信登录、手机号登录、微博登录等乱七八糟的登录方式就是策略。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值