这是哪种设计模式? printPersonsOlderThan

时间:2017-04-06 19:32:23

标签: java oop design-patterns decoupling

我读了很多关于设计模式的内容,但我仍然难以确定何时必须使用它们。今天我正在阅读有关lambdas的oracle文档,并看到了一个类“evolution”并说“嘿,显然这里有一些脱钩”。我认为这里有一个众所周知的模式,但不确切知道哪个是。

我还有一个问题是,如果我没有使用SPRING,那么关于接口和实现的文件夹结构非常清楚,这将是-ogcording goog practice-我必须创建接口的项目结构。

示例以此代码开头:

public static void printPersonsOlderThan(List<Person> roster, int age) {
    for (Person p : roster) {
        if (p.getAge() >= age) {
            p.printPerson();
        }
    }
}

然后继续:

public static void printPersonsWithinAgeRange(
    List<Person> roster, int low, int high) {
    for (Person p : roster) {
        if (low <= p.getAge() && p.getAge() < high) {
            p.printPerson();
        }
    }
}

以此结束:

public static void printPersons(
    List<Person> roster, CheckPerson tester) {
    for (Person p : roster) {
        if (tester.test(p)) {
            p.printPerson();
        }
    }
}

创建此界面:

interface CheckPerson {
    boolean test(Person p);
}

这就是实施:

class CheckPersonEligibleForSelectiveService implements CheckPerson {
    public boolean test(Person p) {
        return p.gender == Person.Sex.MALE &&
            p.getAge() >= 18 &&
            p.getAge() <= 25;
    }
}

3 个答案:

答案 0 :(得分:4)

答案 1 :(得分:1)

我通过大学最高等级的设计模式科目,但我似乎无法找出任何熟悉的模式。

最有可能的是,没有使用预定义的模式,但CheckPerson已被抽象,原因很明显。

在University,我们将包中的类分组,并且Interfaces通常放在具有实现类的同一个包中。

答案 2 :(得分:-1)

除访客外,您还可以考虑使用Strategy模式。

public abstract class PrintStrategy {

    abstract protected List<Person> checkPerson(List<Person> list);

    public void printPerson(List<Person> roster){

        List<Person> filteredRoster = this.checkPerson(roster);
        for (Person person : filteredRoster) {
            person.print();
        }
    }
}

public class PrintOlderThanStartegy extends PrintStrategy {

    private final int ageWaterMark;

    public PrintOlderThanStartegy(final int ageWaterMark){
        this.ageWaterMark = ageWaterMark;
    }

    protected List<Person> checkPerson(List<Person> roster) {

        List<Person> filteredRoster = new ArrayList<Person>();
        for (Person person : roster) {
            if(person.getAge() > ageWaterMark){
                filteredRoster.add(person);
            }
        }
        return filteredRoster;
    }

}

public class Test {

    public static void main(String[] args) {
        List<Person> roster = new ArrayList<Person>();

        Person p1 = new Person();
        p1.setAge(50);
        Person p2 = new Person();
        p2.setAge(20);

        roster.add(p1);
        roster.add(p2);

        PrintStrategy printStrategy = new PrintOlderThanStartegy(30);
        printStrategy.printPerson(roster);
    }

}