前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >规格模式

规格模式

作者头像
三流编程
发布2022-10-25 18:36:16
4410
发布2022-10-25 18:36:16
举报

根据条件查询对象,每一种查找条件定义一个类。

代码语言:javascript
复制
public class User { //姓名
    private String name;  
    private int age;  
    public User(String _name,int _age){
        this.name = _name; this.age = _age;
    }  
    // getter/setter
}

现在有许多 User 对象,根据 name 和 age 之类的条件查询出匹配的对象。

代码语言:javascript
复制
public class UserProvider {
    private ArrayList<User> userList; 
    public UserProvider(ArrayList<User> _userList){
        this.userList = _userList;
    }  
    public ArrayList<User> findUserByAgeThan(int age) {
        ArrayList<User> result = new ArrayList<User>(); 
        for(User u:userList){
            if(u.getAge()>age){ 
                result.add(u);
            }
        }
        return result;
    }  

    public ArrayList<User> findUserByNameEqual(String name) {
        ArrayList<User> result = new ArrayList<User>(); 
        for(User u:userList){
            if(u.getName().equals(name)){
                result.add(u);
            }
        }
    } 
}

两个方法,遍历查询指定名字和年龄大于指定值的用户。

缺点在于增加一种查询条件,就要在 UserProvider 里添加方法,不符合开闭。

所以想把查询条件封装成对象 Condition,这样查询指定姓名的叫 NameEqualCondition,年龄大于指定值的叫 AgeThanCondition,然后自然而然的就写成了下面这样。

代码语言:javascript
复制
public interface Condition {
    public boolean match(User user); // 这个user是否满足我的条件
}
public class NameEqualCondition implements Condition {
    private String name;
    public NameEqualCondition(String name) {
        this.name = name;
    }
    public boolean match(User user) {
        return user.name.equals(name);
    }
}
public class AgeThanCondition implements Condition {
    private int age;
    public AgeThanCondition(int age) {
        this.age = age;
    }
    public boolean match(User user) {
        return user.age > age;
    }
}
代码语言:javascript
复制
public class UserProvider {
    private ArrayList<User> userList; 
    public UserProvider(ArrayList<User> _userList){
        this.userList = _userList;
    }  
    public ArrayList<User> findUser(Condition condition) {
        ArrayList<User> result = new ArrayList<User>(); 
        for(User u:userList){
            if(condition.match(u)){ 
                result.add(u);
            }
        }
        return result;
    }
}

然后一些逻辑关系,比如姓名相等且年龄大于多少,逻辑条件也作为一种 Condition。由于它是两个 Condition 的逻辑关系,所以构造的参数是别的 Condition。比如

代码语言:javascript
复制
public class AndCondition implements Condition {
    private Condition c1;
    private Condition c2;
    public AndCondition(Condition c1, Condition c2) {
        this.c1 = c1;
        this.c2 = c2;
    }
    public boolean match(User user) {
        return c1(user) && c2(user);
    }
}

这内部的参数应该是普通的 Condition,不能是逻辑条件,所以普通的判断条件和逻辑条件,应该分别派生出一个接口出来,两者区分开来,这里就不写了。

代码语言:javascript
复制
// 然后外面这么调用就行了
Condition condition = new AndCondition( new NameEqualCondition("zhangsan"), new AgeThanCondition(15) );
condition.match(user);
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档