2017-04-06 162 views
1

我閱讀了很多關於設計模式的書,但是我仍然很難識別何時需要使用它們。今天,我正在閱讀關於lambda的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; 
    } 
} 
+1

這裏的問題究竟是什麼? –

+0

你在這裏看到設計模式嗎?如果是...至極? – sebasm

回答

1

我通過設計模式的主題在大學成績最好,但我似乎無法找到任何熟悉的模式。

最有可能的是,沒有使用預定義的模式,但由於顯而易見的原因,CheckPerson已被抽象化。

在大學,我們將包中的類分組,並且接口通常與實現類放在同一個包中。

+0

你是否同意堆垛機關於訪客模式?我認爲他是對的。 – sebasm

+0

感謝您的支持!我看着訪客模式的例子,並且必須承認它看起來很像。 – solstinger

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

}