【问题标题】:Which design pattern is this? printPersonsOlderThan这是哪种设计模式? printPersonsOldThan
【发布时间】:2018-06-02 06:26:13
【问题描述】:

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

我对此还有一个问题是,如果我不使用 SPRING,其中关于接口和实现的文件夹结构非常清晰,这将是 - 根据 goog 实践 - 我必须创建接口的项目结构。

示例以以下代码开头:

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;
    }
}

【问题讨论】:

  • 这里的问题到底是什么?
  • 您在这里看到设计模式了吗?如果是的话……哪一个?

标签: java oop design-patterns decoupling


【解决方案1】:

基本上你已经实现了一个filter,就像一个Java FileFilter,这接近visitor pattern

Could someone in simple terms explain to me the visitor pattern's purpose with examples if possible

【讨论】:

    【解决方案2】:

    我以最高的成绩通过了大学的设计模式科目,但我似乎仍然无法识别任何熟悉的模式。

    很可能没有使用预定义的模式,但出于显而易见的原因,CheckPerson 已被抽象出来。

    在大学,我们将类分组到包中,接口通常与实现类放在同一个包中。

    【讨论】:

    • 你不同意stacker关于访问者模式的观点吗?我认为他是对的。
    • 感谢您的支持!我研究了访问者模式示例,并且必须承认它看起来非常相似。
    【解决方案3】:

    除了Visitor,可以考虑使用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);
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-09
      相关资源
      最近更新 更多