Java デザイン パターンの組み合わせパターンとフィルター パターンの概要 (コード例)

不言
リリース: 2018-09-12 16:10:17
オリジナル
1644 人が閲覧しました

この記事では、Java デザイン パターンの組み合わせモードとフィルター モードについて説明します (コード例)。必要な方は参考にしていただければ幸いです。

はじめに

前の記事では、構造モードの外観モードとデコレーターモードについて学びました。この記事では、コンビネーションモードとフィルターモードについて学びます。

結合モード

はじめに

結合モードは、類似したオブジェクトのグループを単一のオブジェクトとして扱うために使用されます。合成モードでは、部分階層と全体階層を表すために使用されるツリー構造に従ってオブジェクトが結合されます。このタイプのデザイン パターンは構造パターンであり、オブジェクトのグループのツリー構造を作成します。

簡単に言うと、似たようなオブジェクトをツリー構造に従って結合し、その部分が何に使われるかを示すことです。に非常に鮮明な例があります。これは、コンピューターの ファイル システム です。

ファイル システムはディレクトリとファイルで構成されます。各ディレクトリにはコンテンツを含めることができます。ディレクトリの内容はファイルまたはディレクトリになります。このようにして、コンピュータのファイル システムは再帰的な構造で編成されます。

もちろん、ここで簡単な例を使用して組み合わせモードを説明することもできます。

学校にはたくさんの生徒がいますが、生徒会長、生徒会役員、モニター、体育委員など様々な個性を持った生徒がいます。もちろん、ほとんどが普通の生徒です。他の役職はありませんでした。このとき、結合モードを使用して結合できます。

管理者によると、学生の最大の地位は生徒会長であり、生徒会長の下に生徒会のメンバーがおり、その後、生徒会のメンバーは互いに独立しており、一部または一部になることができます。最終的には全体として一つになります。組み合わせモードの树形结构以表示‘部分-整体’的层次结构と非常に一致していると言えます。

これ以上ナンセンスではありません。以下のコードを開発してみましょう。
まず、生徒の名前と位置の属性を使用して生徒クラスを定義します。
次に、add()、remove()、get() メソッドを学生クラスに追加し、最後に階層呼び出しを行います。

コード例:

class Student{
    private String name;
    
    private String position;
    
    private List<Student> students;

    public Student(String name, String position) {
        this.name = name;
        this.position = position;
        students=new ArrayList<Student>();
    }
    
    
    public void add(Student student){
        students.add(student);
    }
    
    public void remove(Student student){
        students.remove(student);
    }
    
    public List<Student> get(){
        return students;
    }
    
    @Override
    public String toString() {
        return "Student [name=" + name + ", position=" + position + "]";
    }   
}


public class CompositeTest {

    public static void main(String[] args) {

        Student studentLeader=new Student("小明","学生会主席");

        Student committeeMember=new Student("小刚","学生会委员");
        
        Student student=new Student("小红","学生");
        
        committeeMember.add(student);
        studentLeader.add(committeeMember);
        
        System.out.println("-"+studentLeader);
        studentLeader.get().forEach(sl->{
            System.out.println("--"+sl);
            sl.get().forEach(cm->{
                System.out.println("---"+cm);
            });
        });
    }
}
ログイン後にコピー

出力結果:

    -Student [name=小明, position=学生会主席]
    --Student [name=小刚, position=学生会委员]
    ---Student [name=小红, position=学生]
ログイン後にコピー

上記の例では、生徒会長と生徒会役員の役割を担う 3 人の生徒を追加しました (さらに多くの生徒が同じですが、主にアイデアです)。学校と生徒たち。その中で、生徒会長は生徒を管理し、生徒会委員は生徒を管理するという階層構造になっています。この中で、結合モードが実際にはオブジェクトを別のオブジェクトに組み込み、結合を通じて何らかのレイアウトを実行することであることもわかりました。

結合モードの利点:

高レベルのモジュール呼び出しが比較的簡単で、ノードの追加に便利です。

組み合わせパターンの欠点:

その子ノードの宣言はすべてインターフェースではなく実装クラスであるため、依存関係逆転の原則に違反します。

使用シナリオ:
は、「部分-全体」の階層構造として表現できます。

フィルター パターン

はじめに

フィルター パターンを使用すると、開発者はさまざまな基準を使用してオブジェクトのセットをフィルターし、論理演算を通じて分離された方法でオブジェクトを接続できます。このタイプの設計パターンは、複数の基準を組み合わせて 1 つの基準を達成する構造パターンです。

簡単に言えば、このモードの機能はその名前の通り、フィルターとして機能します。通常、バックグラウンド インターフェイスを開発するときは、いくつかのリクエストも除外します。実際、フィルター モードは主にこの関数を実装します。これ以上の説明はせずに、対応するコードの説明から始めましょう。

ここでは引き続き生徒を使用して説明します。学校には男子と女子がおり、学校には異なる学年があります。このとき、フィルター モードを使用して生徒の関連情報をグループ化できます。たとえば、その学校には男子が何人、1 年生に女子が何人、3 年生または女子が何人いるかなどを数えます。

コード例:
コードが多いので、ここで分けて説明します。
まず、名前、性別、学年の 3 つの属性を持つエンティティ クラスを定義します。

class Student{
    private String name; 
    private String gender; 
    private Integer grade;
    public Student(String name, String gender, Integer grade) {
        super();
        this.name = name;
        this.gender = gender;
        this.grade = grade;
    }
    
    public String getName() {
        return name;
    }
    
    public void setName(String name) {
        this.name = name;
    }
    
    public String getGender() {
        return gender;
    }
    
    public void setGender(String gender) {
        this.gender = gender;
    }
    
    public Integer getGrade() {
        return grade;
    }
    
    public void setGrade(Integer grade) {
        this.grade = grade;
    }

    @Override
    public String toString() {
        return "Student [name=" + name + ", gender=" + gender + ", grade=" + grade + "]";
    }
}
ログイン後にコピー

次に、パブリックインターフェースを定義し、実装方法を指定します。

interface FilterinGrule {
    List<Student>  filter(List<Student> students);
}
ログイン後にコピー

次に、インターフェイスを実装し、さまざまなフィルタリング ルールを定式化します。ここには主に 3 つのルールがあります。通常のフィルタリングとフィルタリングまたはフィルタリングです。
具体的な実装方法は以下の通りです:

class MaleStudents implements FilterinGrule{
    @Override
    public List<Student> filter(List<Student> students) {
        List<Student> maleStudents = new ArrayList<Student>(); 
        students.forEach(student->{
             if(student.getGender().equalsIgnoreCase("male")){
                 maleStudents.add(student);
             }
        });
        return maleStudents;
    }
}

class FemaleStudents implements FilterinGrule{
    @Override
    public List<Student> filter(List<Student> students) {
        List<Student> femaleStudents = new ArrayList<Student>(); 
        students.forEach(student->{
             if(student.getGender().equalsIgnoreCase("female")){
                 femaleStudents.add(student);
             }
        });
        return femaleStudents;
    }
}

class SecondGrade implements FilterinGrule{
    @Override
    public List<Student> filter(List<Student> students) {
        List<Student> secondGradeStudents = new ArrayList<Student>(); 
        students.forEach(student->{
             if(student.getGrade() == 2){
                 secondGradeStudents.add(student);
             }
        });
        
        return secondGradeStudents;
    }
}


class And implements FilterinGrule{
     private FilterinGrule filter;
     private FilterinGrule filter2;
    
     public And(FilterinGrule filter,FilterinGrule filter2) {
         this.filter=filter;
         this.filter2=filter2;
     }
    
    @Override
    public List<Student> filter(List<Student> students) {
        List<Student> students2=filter.filter(students);
        return filter2.filter(students2);
    }
}

class Or implements FilterinGrule{
     private FilterinGrule filter;
     private FilterinGrule filter2;
    
     public Or(FilterinGrule filter,FilterinGrule filter2) {
         this.filter=filter;
         this.filter2=filter2;
     }
    
    @Override
    public List<Student> filter(List<Student> students) {
        List<Student> students1=filter.filter(students);
        List<Student> students2=filter2.filter(students);
        students2.forEach(student->{
             if(!students1.contains(student)){
                 students1.add(student);
             }
        });
        return students1;
    }
}
ログイン後にコピー

最後にテストを呼び出し、生徒を追加し、性別とクラスを指定します。次に、さまざまな条件に基づいてフィルタリングします。

public class FilterTest {

    public static void main(String[] args) {
        List<Student> list=new ArrayList<Student>();
        list.add(new Student("小明", "male", 1));
        list.add(new Student("小红", "female", 2));
        list.add(new Student("小刚", "male", 2));
        list.add(new Student("小霞", "female", 3));
        list.add(new Student("小智", "male", 3));
        list.add(new Student("虚无境", "male", 1));
        
        
        FilterinGrule male = new MaleStudents();
        FilterinGrule female = new FemaleStudents();
        FilterinGrule secondGrade = new SecondGrade();
        FilterinGrule secondGradeMale = new And(secondGrade, male);
        FilterinGrule secondGradeOrFemale = new Or(secondGrade, female);
        
        System.out.println("男生:"+male.filter(list));
        System.out.println("女生:"+female.filter(list));
        System.out.println("二年级学生:"+secondGrade.filter(list));
        System.out.println("二年级男生:"+secondGradeMale.filter(list));
        System.out.println("二年级的学生或女生:"+secondGradeOrFemale.filter(list));      
    }
}
ログイン後にコピー

出力結果:

男生:[Student [name=小明, gender=male, grade=1], Student [name=小刚, gender=male, grade=2], Student [name=小智, gender=male, grade=3], Student [name=虚无境, gender=male, grade=1]]
女生:[Student [name=小红, gender=female, grade=2], Student [name=小霞, gender=female, grade=3]]
二年级学生:[Student [name=小红, gender=female, grade=2], Student [name=小刚, gender=male, grade=2]]
二年级男生:[Student [name=小刚, gender=male, grade=2]]
二年级的学生或女生:[Student [name=小红, gender=female, grade=2], Student [name=小刚, gender=male, grade=2], Student [name=小霞, gender=female, grade=3]]
ログイン後にコピー

通过上述示例,我们发现过滤器模式其实很简单,制定过滤规则,然后再根据制定的标准来进行过滤,得到符合条件的数据。过滤器模式虽然简单,但是在构建过滤规则的时候,有点繁琐,不过在jdk1.8之后,我们可以使用stream流更方便的进行规则的制定(这一点留在以后再讲)。

过滤器模式的优点:

简单,解耦,使用方便。

过滤器模式的缺点:

好像没有。。。

使用场景:

需要进行筛选的时候。

相关推荐:

Java设计模式中外观模式和装饰器模式的介绍(代码示例)

Java设计模式中适配器模式和桥接模式的介绍(代码示例)

以上がJava デザイン パターンの組み合わせパターンとフィルター パターンの概要 (コード例)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!