您的位置:首页 > 其它

新模式以及设计模式比较

2016-06-09 21:43 155 查看

规格模式

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



        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登录、微信登录、手机号登录、微博登录等乱七八糟的登录方式就是策略。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: