2017-04-06 8 views
1

私はデザインパターンについて多くのことを読んでいますが、私はそれらを使用する必要があるときにはまだ難しいと認識しています。今日、ラムダに関するオラクルのドキュメントを読んで、クラス「進化」を見て、「ねえ、ここにはいくつかのデカップリングがあります」と言いました。私はここによく知られているパターンがあると思うが、正確にはわからない。デザインパターンはこれですか?

また、私はSPRINGを使用していない場合、インターフェイスと実装についてのフォルダ構造が非常に明確で、goog practices-私はインターフェイスを作成する必要があるプロジェクト構造になります。

の例では、このコードを開始しました:

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

そして、これが実現した:

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

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

} 
関連する問題