一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Java進階篇設(shè)計模式之六 - 組合模式和過濾器模式

 新進小設(shè)計 2022-12-19 發(fā)布于北京

前言

在上一篇中我們學(xué)習(xí)了結(jié)構(gòu)型模式的外觀模式和裝飾器模式。本篇則來學(xué)習(xí)下組合模式和過濾器模式。

組合模式

簡介

組合模式是用于把一組相似的對象當(dāng)作一個單一的對象。組合模式依據(jù)樹形結(jié)構(gòu)來組合對象,用來表示部分以及整體層次。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它創(chuàng)建了對象組的樹形結(jié)構(gòu)。

簡單來說的話,就是根據(jù)樹形結(jié)構(gòu)把相似的對象進行組合,然后表示該部分是用來做啥的。在<大話設(shè)計模式>中有個很形象的例子,就是電腦中的 文件系統(tǒng)。

文件系統(tǒng)由目錄和文件組成。每個目錄都可以裝內(nèi)容。目錄的內(nèi)容可以是文件,也可以是目錄。按照這種方式,計算機的文件系統(tǒng)就是以遞歸結(jié)構(gòu)來組織的。

當(dāng)然,這里我們也可以使用一個簡單的示例來對組合模式進行講解。

在學(xué)校中,有很多學(xué)生,但是這些學(xué)生中又有不同的身份,有的學(xué)生是學(xué)生會主席,有的是學(xué)生會委員,有的是班長,有的是體育委員等等, 當(dāng)然大部分都是普通的學(xué)生,并沒有擔(dān)當(dāng)其它的職位。這時我們就可以使用組合模式來進行組合。

按照管理層來看,學(xué)生職位中最大的是學(xué)生會主席,學(xué)生會主席下有學(xué)生會委員,然后學(xué)生會委員又管理著普通的學(xué)生,他們之間相互獨立,可以成為一個部分,也可以最終成為一個整體??梢哉f非常符合組合模式中的樹形結(jié)構(gòu)以表示'部分-整體’的層次結(jié)構(gòu)

廢話不在多說了,下面進行代碼的開發(fā)。
首先定義一個學(xué)生類,有學(xué)生姓名和職位屬性。
然后在學(xué)生類中在添加 add()、remove()、get()方法,最后進行層級調(diào)用。

代碼示例:

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("小明","學(xué)生會主席");

        Student committeeMember=new Student("小剛","學(xué)生會委員");
        
        Student student=new Student("小紅","學(xué)生");
        
        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);
            });
        });
    }
}

 

輸出結(jié)果:

    -Student [name=小明, position=學(xué)生會主席]
    --Student [name=小剛, position=學(xué)生會委員]
    ---Student [name=小紅, position=學(xué)生]

 

在上述示例中,我們添加了三個學(xué)生(更多也一樣,主要是思路),在學(xué)校中分別扮演 學(xué)生會主席、學(xué)生會委員以及學(xué)生。其中學(xué)生會主席管理著學(xué)生會委員,學(xué)生會委員管理著學(xué)生,他們之間屬于層級關(guān)系,一層層的包含。在這之中,我們也發(fā)現(xiàn)一點,其實組合模式就是把某個對象去包含另一個對象,然后通過組合的方式來進行一些布局。

組合模式的優(yōu)點:

高層模塊調(diào)用較為簡單,增加某個節(jié)點方便。

組合模式的缺點:

因為其子節(jié)點的聲明都是實現(xiàn)類,而不是接口,違反了依賴倒置原則。

使用場景:
可以表示為 '部分-整體’的層級結(jié)構(gòu)。

過濾器模式

簡介

過濾器模式允許開發(fā)人員使用不同的標(biāo)準(zhǔn)來過濾一組對象,通過邏輯運算以解耦的方式把它們連接起來。這種類型的設(shè)計模式屬于結(jié)構(gòu)型模式,它結(jié)合多個標(biāo)準(zhǔn)來獲得單一標(biāo)準(zhǔn)。

簡單的來說該模式的功能就是如其名,做一個過濾的作用。我們在一般在進行后臺接口開發(fā)的時候,也會根據(jù)過濾掉一些請求。其實過濾器模式主要實現(xiàn)也是這種功能,廢話不多說,開始用代碼進行相應(yīng)的說明。

這里依舊用學(xué)生來進行講解,學(xué)校的學(xué)生中有男生和女生,學(xué)校又有不同的年級,這時我們相統(tǒng)計下學(xué)生的相關(guān)信息,就可以使用過濾器模式來進行分組了。比如,統(tǒng)計該學(xué)校有多少男生,一年級的女生有多少,三年級的學(xué)生或者女生有多少之類等等。

代碼示例:
由于代碼有點多,這里就分開進行講解。
首先定義一個實體類,有姓名、性別、年級這三個屬性。

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 + "]";
    }
}

 

然后再定義一個公用的接口,指定實現(xiàn)的方法。

interface FilterinGrule {
    List<Student>  filter(List<Student> students);
}

 

然后再實現(xiàn)該接口,制定不同的過濾規(guī)則。這里主要是三種規(guī)則,普通的過濾,且過濾,或過濾。
具體實現(xiàn)的方法如下:

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

 

最后再來進行調(diào)用測試,添加一些學(xué)生,并且指定性別以及班級。然后根據(jù)不同的條件來進行過濾。

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("二年級學(xué)生:"+secondGrade.filter(list));
        System.out.println("二年級男生:"+secondGradeMale.filter(list));
        System.out.println("二年級的學(xué)生或女生:"+secondGradeOrFemale.filter(list));        
    }
}

 

輸出結(jié)果:

男生:[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]]
二年級學(xué)生:[Student [name=小紅, gender=female, grade=2], Student [name=小剛, gender=male, grade=2]]
二年級男生:[Student [name=小剛, gender=male, grade=2]]
二年級的學(xué)生或女生:[Student [name=小紅, gender=female, grade=2], Student [name=小剛, gender=male, grade=2], Student [name=小霞, gender=female, grade=3]]

 

通過上述示例,我們發(fā)現(xiàn)過濾器模式其實很簡單,制定過濾規(guī)則,然后再根據(jù)制定的標(biāo)準(zhǔn)來進行過濾,得到符合條件的數(shù)據(jù)。過濾器模式雖然簡單,但是在構(gòu)建過濾規(guī)則的時候,有點繁瑣,不過在jdk1.8之后,我們可以使用stream流更方便的進行規(guī)則的制定(這一點留在以后再講)。

過濾器模式的優(yōu)點:

簡單,解耦,使用方便。

過濾器模式的缺點:

好像沒有。。。

使用場景:

需要進行篩選的時候。

 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    午夜直播免费福利平台| 尹人大香蕉中文在线播放| 亚洲第一区二区三区女厕偷拍| 久久精品久久久精品久久| 中文字幕日韩欧美理伦片| 国产精品国三级国产专不卡| 最新国产欧美精品91| 亚洲一二三四区免费视频| 亚洲欧洲成人精品香蕉网| 日韩三级黄色大片免费观看| 国产又爽又猛又粗又色对黄| 欧美成人国产精品高清| 91亚洲精品亚洲国产| 偷拍偷窥女厕一区二区视频| 日韩三级黄色大片免费观看| 欧美午夜视频免费观看| 精品精品国产欧美在线| 青青操在线视频精品视频| 麻豆91成人国产在线观看| 99久久精品免费看国产高清| 午夜精品成年人免费视频| 在线日本不卡一区二区| 六月丁香六月综合缴情| 欧美一区二区三区高潮菊竹| 国产成人免费激情视频| 日韩人妻免费视频一专区| 少妇高潮呻吟浪语91| 精品一区二区三区免费看| 久久精品国产99国产免费| 国产午夜免费在线视频| 欧美又黑又粗大又硬又爽| 一区二区三区日本高清| 国内真实露脸偷拍视频| 精品少妇人妻av一区二区蜜桃 | 精品偷拍一区二区三区| 高清在线精品一区二区| 亚洲综合日韩精品欧美综合区| 国产日产欧美精品视频| 国产香蕉国产精品偷在线观看| 91人人妻人人爽人人狠狠| 国产精品色热综合在线|