国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

設(shè)計(jì)模式-組合模式(Composite Pattern)

這篇具有很好參考價值的文章主要介紹了設(shè)計(jì)模式-組合模式(Composite Pattern)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

1. 概念

  • 組合模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許將對象組合成樹狀的層次結(jié)構(gòu),用來表示“整體-部分”的關(guān)系。

2. 原理結(jié)構(gòu)圖

原理圖
設(shè)計(jì)模式-組合模式(Composite Pattern),設(shè)計(jì)模式,設(shè)計(jì)模式,組合模式,java

  • 抽象角色(Component):這是組合模式的核心,它定義了樹葉和樹枝構(gòu)件的公共接口,并可能提供一些默認(rèn)行為。在透明式的組合模式中,它還聲明了訪問和管理子類的接口;而在安全式的組合模式中,這些管理工作由樹枝構(gòu)件完成。
  • 樹葉角色(Leaf):這個角色代表了組合中的葉節(jié)點(diǎn)對象,它沒有子節(jié)點(diǎn),用于繼承或?qū)崿F(xiàn)抽象構(gòu)件。簡單來說,樹葉構(gòu)件是基本的對象,沒有進(jìn)一步分解的部分。
  • 樹枝角色(Composite):這個角色是組合中的分支節(jié)點(diǎn)對象,它有子節(jié)點(diǎn),同樣用于繼承和實(shí)現(xiàn)抽象構(gòu)件。樹枝構(gòu)件的主要作用是存儲和管理子部件,通常包含添加、刪除、獲取子節(jié)點(diǎn)的方法。

透明組合模式設(shè)計(jì)模式-組合模式(Composite Pattern),設(shè)計(jì)模式,設(shè)計(jì)模式,組合模式,java

  • 透明組合模式的特點(diǎn)是Leaf 和 Composite 具有相同的接口。因此,無論客戶端處理的是 Leaf 還是 Composite,都可以使用相同的接口。這使得客戶端的操作更加簡單和直觀。然而,透明組合模式的一個潛在問題是,對于葉子節(jié)點(diǎn)來說,某些操作(如添加或刪除子節(jié)點(diǎn))是無意義的,這可能在運(yùn)行時引發(fā)錯誤,除非有適當(dāng)?shù)腻e誤處理機(jī)制。

安全組合模式
設(shè)計(jì)模式-組合模式(Composite Pattern),設(shè)計(jì)模式,設(shè)計(jì)模式,組合模式,java文章來源地址http://www.zghlxwxcb.cn/news/detail-848679.html

  • 安全組合模式的主要特點(diǎn)是,它將管理子構(gòu)件的方法移到樹枝構(gòu)件中,使得抽象構(gòu)件和樹葉構(gòu)件沒有管理子對象的方法,從而避免了潛在的安全性問題。這種設(shè)計(jì)使得客戶端在處理不同角色時能夠明確區(qū)分,但對于客戶端來說,可能需要針對不同類型的對象進(jìn)行不同的操作,因此不夠透明。

3. 代碼示例

3.1 示例1:透明組合模式
  • 一個公司的組織結(jié)構(gòu),其中公司是一個復(fù)合對象,包含多個部門,而部門既可以包含其他部門(例如子部門),也可以包含員工(葉子節(jié)點(diǎn))。
interface Component {  
    void operation();  
    void add(Component component);  
    void remove(Component component);  
    Component getChild(int index);  
    int getChildCount();  
    boolean isComposite();  
}
// 葉子節(jié)點(diǎn):員工  
class Leaf implements Component {  
    private String name;  
  
    public Leaf(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public void operation() {  
        System.out.println("Employee " + name + " is working.");  
    }  
  
    @Override  
    public void add(Component component) {  
        throw new UnsupportedOperationException("Cannot add to a leaf.");  
    }  
  
    @Override  
    public void remove(Component component) {  
        throw new UnsupportedOperationException("Cannot remove from a leaf.");  
    }  
  
    @Override  
    public Component getChild(int index) {  
        throw new UnsupportedOperationException("Leaf has no children.");  
    }  
  
    @Override  
    public int getChildCount() {  
        return 0;  
    }  
  
    @Override  
    public boolean isComposite() {  
        return false;  
    }  
}  
  
// 復(fù)合節(jié)點(diǎn):部門  
class Composite implements Component {  
    private List<Component> children = new ArrayList<>();  
    private String name;  
  
    public Composite(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public void operation() {  
        System.out.println("Department " + name + " is managing its resources.");  
        for (Component child : children) {  
            child.operation();  
        }  
    }  
  
    @Override  
    public void add(Component component) {  
        children.add(component);  
    }  
  
    @Override  
    public void remove(Component component) {  
        children.remove(component);  
    }  
  
    @Override  
    public Component getChild(int index) {  
        return children.get(index);  
    }  
  
    @Override  
    public int getChildCount() {  
        return children.size();  
    }  
  
    @Override  
    public boolean isComposite() {  
        return true;  
    }  
}

public class CompanyStructureDemo {  
    public static void main(String[] args) {  
        // 創(chuàng)建部門(復(fù)合節(jié)點(diǎn))和員工(葉子節(jié)點(diǎn))  
        Component hr = new Composite("HR Department");  
        Component it = new Composite("IT Department");  
        Component employee1 = new Leaf("John Doe");  
        Component employee2 = new Leaf("Jane Smith");  
        Component subDepartment = new Composite("Sub IT Department");  
        Component employee3 = new Leaf("Bob Johnson");  
  
        // 將員工添加到部門中  
        hr.add(employee1);  
        hr.add(employee2);  
  
        // 創(chuàng)建子部門,并將員工添加到子部門中  
        subDepartment.add(employee3);  
  
        // 將子部門添加到IT部門中  
        it.add(subDepartment);  
  
        // 執(zhí)行操作  
        hr.operation();  
        it.operation();  
  
        // 移除操作(如果需要)  
        // hr.remove(employee1);  
  
        // 訪問子節(jié)點(diǎn)(如果需要)  
        // Component child = hr.getChild(0);  
        // child.operation();  
    }  
}
  • 輸出
Department HR Department is managing its resources.
Employee John Doe is working.
Employee Jane Smith is working.
Department IT Department is managing its resources.
Department Sub IT Department is managing its resources.
Employee Bob Johnson is working.
  • 這個案例展示了組織結(jié)構(gòu),其中部門可以包含其他部門或員工,而員工不能包含其他組件。通過這種方式,客戶端可以一致地處理單個員工和整個部門,無需關(guān)心它們的具體類型。

3.2 示例2:安全組合模式
  • 文件系統(tǒng)案例
interface FileSystemElement {  
    void print(); // 打印文件系統(tǒng)元素  
}

class File implements FileSystemElement {  
    private String name;  
    private long size;  
  
    public File(String name, long size) {  
        this.name = name;  
        this.size = size;  
    }  
  
    @Override  
    public void print() {  
        System.out.println("文件: " + name + ", 大小: " + size + " 字節(jié)");  
    }  
}

class Directory implements FileSystemElement {  
    private String name;  
    private List<FileSystemElement> children = new ArrayList<>();  
  
    public Directory(String name) {  
        this.name = name;  
    }  
  
    @Override  
    public void print() {  
        System.out.println("目錄: " + name);  
        for (FileSystemElement child : children) {  
            child.print(); // 遞歸打印子文件和子目錄  
        }  
    }  
  
    // 安全組合模式特有的方法,用于添加子文件和子目錄  
    public void add(FileSystemElement fileSystemElement) {  
        children.add(fileSystemElement);  
    }  
  
    // 安全組合模式特有的方法,用于移除子文件和子目錄  
    public void remove(FileSystemElement fileSystemElement) {  
        children.remove(fileSystemElement);  
    }  
  
    // 隱藏子文件和子目錄的訪問,這是安全組合模式的關(guān)鍵點(diǎn)  
    // 這里沒有提供直接訪問子文件和子目錄的方法  
}

public class FileSystemDemo {  
    public static void main(String[] args) {  
        // 創(chuàng)建文件  
        FileSystemElement file1 = new File("example.txt", 1024);  
        FileSystemElement file2 = new File("report.pdf", 5120);  
  
        // 創(chuàng)建目錄  
        Directory docsDir = new Directory("docs");  
        docsDir.add(file1);  
  
        Directory imagesDir = new Directory("images");  
        imagesDir.add(new File("photo.jpg", 20480));  
  
        // 創(chuàng)建根目錄  
        Directory rootDir = new Directory("/");  
        rootDir.add(docsDir);  
        rootDir.add(imagesDir);  
        rootDir.add(file2);  
  
        // 打印整個文件系統(tǒng)  
        rootDir.print();  
  
        // 客戶端不能直接操作子文件和子目錄,只能通過目錄系統(tǒng)來完成  
        // 例如,添加文件需要首先找到對應(yīng)的目錄  
        // 然后通過目錄提供的方法來添加  
        // Directory newDir = new Directory("newDir");  
        // rootDir.add(newDir);  
  
        // 同樣,移除文件或目錄也需要通過文件系統(tǒng)來完成  
        // rootDir.remove(docsDir);  
    }  
}
  • 將看到如下輸出:
目錄: /  
目錄: docs  
文件: example.txt, 大小: 1024 字節(jié)  
目錄: images  
文件: photo.jpg, 大小: 20480 字節(jié)  
文件: report.pdf, 大小: 5120 字節(jié)
  • 在這個安全組合模式的實(shí)現(xiàn)中,客戶端可以打印整個文件系統(tǒng)或者子目錄,但不能直接操作子文件和子目錄。對于文件和目錄的添加、刪除和修改,客戶端需要通過目錄提供的 add 和 remove 方法來執(zhí)行。這樣,文件和目錄的管理被封裝在目錄內(nèi)部,提高了安全性并簡化了客戶端的使用。安全組合模式適用于那些需要限制對子對象直接訪問的場景,如本例中的文件系統(tǒng)。

4. 優(yōu)缺點(diǎn)

  • 主要作用
    • 將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次關(guān)系,它讓客戶端可以一致地對待單個對象和組合對象。
  • 優(yōu)點(diǎn)
    • 定義層次結(jié)構(gòu):它允許你清晰地定義分層次的復(fù)雜對象,并表示對象的全部或部分層次。
    • 忽略層次差異:客戶端可以忽略層次之間的差異,方便對整個層次結(jié)構(gòu)進(jìn)行控制。
    • 簡化客戶端代碼:由于組合模式提供了統(tǒng)一的接口來處理單個對象和組合對象,因此可以減少客戶端的代碼復(fù)雜度。
    • 統(tǒng)一訪問方式:用戶可以通過一致的方式訪問單個對象和組合對象,這使得接口對外顯得透明,簡化了用戶的操作。
  • 缺點(diǎn)
    • 設(shè)計(jì)復(fù)雜性增加:組合模式使得設(shè)計(jì)變得更加復(fù)雜,因?yàn)樾枰幚聿煌瑢哟蔚慕M件,包括葉子節(jié)點(diǎn)和容器節(jié)點(diǎn)。這要求開發(fā)者對整體結(jié)構(gòu)有深入的理解,以正確實(shí)現(xiàn)和管理這些組件。
    • 管理困難:在組合模式中,容器對象可以包含其他容器對象,這種遞歸結(jié)構(gòu)可能導(dǎo)致難以管理和維護(hù),特別是在大型系統(tǒng)中。同時,對于組件的添加、刪除和修改操作也可能變得復(fù)雜。
    • 性能開銷:由于組合模式中的對象通常以樹形結(jié)構(gòu)存在,因此在進(jìn)行一些操作時(如遍歷樹),可能會引入額外的性能開銷,特別是在處理大型樹結(jié)構(gòu)時。
    • 客戶端需要了解對象結(jié)構(gòu):雖然組合模式提供了統(tǒng)一的接口來操作組件,但客戶端仍然需要了解組件的結(jié)構(gòu)和類型(例如,區(qū)分葉子節(jié)點(diǎn)和容器節(jié)點(diǎn)),這可能會增加客戶端代碼的復(fù)雜性。

5. 應(yīng)用場景

5.1 主要包括以下幾個方面
  1. 樹狀數(shù)據(jù)結(jié)構(gòu):任何需要以樹狀結(jié)構(gòu)組織數(shù)據(jù)的場景都可以使用組合模式,例如組織架構(gòu)、目錄結(jié)構(gòu)等。

5.2 實(shí)際應(yīng)用
  1. 文件系統(tǒng)和目錄管理:文件系統(tǒng)可以被視為一個樹形結(jié)構(gòu),其中目錄作為容器,文件和子目錄作為內(nèi)容。使用組合模式,可以方便地創(chuàng)建、刪除、移動和復(fù)制文件或目錄,實(shí)現(xiàn)統(tǒng)一的文件和目錄管理。
  2. 組織架構(gòu)和部門管理:在一個企業(yè)或機(jī)構(gòu)中,通常存在多個部門和員工,形成一定的層次結(jié)構(gòu)。使用組合模式,可以構(gòu)建靈活的組織架構(gòu)模型,實(shí)現(xiàn)部門、崗位和員工的統(tǒng)一管理和操作,如計(jì)算總工資、獲取某個部門下的所有員工等。
  3. 菜單和菜單項(xiàng)管理:在圖形界面中,菜單通常包含多個菜單項(xiàng),菜單項(xiàng)可以是子菜單或其他操作項(xiàng)。組合模式可以用于構(gòu)建菜單的樹形結(jié)構(gòu),實(shí)現(xiàn)菜單和菜單項(xiàng)的添加、刪除、遍歷等統(tǒng)一操作。

6. JDK中的使用

  • 在集合框架中,List、Set和Map等接口表示不同類型的集合,而它們的實(shí)現(xiàn)類(如ArrayList、HashSet、HashMap等)則提供了具體的實(shí)現(xiàn)。這些接口和類之間的關(guān)系形成了樹形結(jié)構(gòu),其中接口作為抽象構(gòu)件,而實(shí)現(xiàn)類作為具體的葉子構(gòu)件或容器構(gòu)件。通過這種結(jié)構(gòu),用戶可以統(tǒng)一地使用這些集合類,而無需關(guān)心它們的具體實(shí)現(xiàn)細(xì)節(jié)。

7. 注意事項(xiàng)

  • 抽象層次的一致性:確??蛻舳藢蝹€對象和組合對象的使用具有一致性。這意味著,無論是操作單個對象還是操作組合對象,客戶端調(diào)用的接口應(yīng)該是一樣的。這有助于簡化客戶端代碼,并增強(qiáng)系統(tǒng)的靈活性和可擴(kuò)展性。
  • 遞歸處理:由于組合模式涉及樹形結(jié)構(gòu),因此在處理組合對象時,通常需要遞歸地遍歷整個樹結(jié)構(gòu)。在編寫遞歸算法時,要特別注意避免無限遞歸和棧溢出等問題。
  • 安全性與完整性:在添加、刪除或修改組合對象中的成員時,要確保操作的安全性和數(shù)據(jù)的完整性。例如,在刪除成員時,要確保不會破壞樹形結(jié)構(gòu)的完整性;在添加成員時,要確保新成員與現(xiàn)有成員之間的關(guān)系正確無誤。
  • 性能考慮:組合模式在處理大型樹形結(jié)構(gòu)時可能會帶來性能問題。由于需要遞歸遍歷整個樹結(jié)構(gòu),如果樹很大,那么處理時間可能會很長。因此,在設(shè)計(jì)系統(tǒng)時,要充分考慮性能因素,并考慮使用緩存、優(yōu)化算法等方式來提高性能。
  • 擴(kuò)展性:在設(shè)計(jì)組合模式時,要考慮到未來的擴(kuò)展性。例如,如果將來需要添加新的操作或新的對象類型,系統(tǒng)應(yīng)該能夠靈活地適應(yīng)這些變化。這可以通過使用接口、抽象類等方式來實(shí)現(xiàn)。
  • 封裝性:組合模式中的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)應(yīng)該被封裝起來,以避免客戶端直接訪問和操作內(nèi)部對象。這樣可以提高系統(tǒng)的安全性和穩(wěn)定性,并降低客戶端代碼的復(fù)雜性。
  • 避免過度使用:雖然組合模式具有很多優(yōu)點(diǎn),但并不意味著在所有情況下都應(yīng)該使用它。過度使用組合模式可能會導(dǎo)致系統(tǒng)變得復(fù)雜且難以維護(hù)。因此,在決定是否使用組合模式時,要充分考慮實(shí)際需求和系統(tǒng)的特點(diǎn)。

8. 生成器模式 VS 組合模式 VS 裝飾器模式

模式 目的 模式架構(gòu)主要角色 應(yīng)用場景
建造者模式 分步構(gòu)建復(fù)雜對象 指揮者,生成器 構(gòu)建具有復(fù)雜邏輯的對象
組合模式 表示具有層次結(jié)構(gòu)的對象 組合類和葉子節(jié)點(diǎn) 樹形結(jié)構(gòu)和遞歸結(jié)構(gòu)
裝飾器模式 動態(tài)添加新功能 抽象組件和裝飾器 功能組合和擴(kuò)展

到了這里,關(guān)于設(shè)計(jì)模式-組合模式(Composite Pattern)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 設(shè)計(jì)模式-組合模式(Composite)

    組合模式(Composite Pattern)是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許你將對象組合成樹狀結(jié)構(gòu)以表示“整體-部分”的層次結(jié)構(gòu)。組合模式使得客戶端可以統(tǒng)一處理單個對象和對象組合,而不需要區(qū)分它們。 在本篇博客中,我們將詳細(xì)介紹組合模式的概念,并提供一個簡單的Java代碼示

    2024年02月09日
    瀏覽(28)
  • 【設(shè)計(jì)模式-07】Composite組合模式

    【設(shè)計(jì)模式-07】Composite組合模式

    定義抽象節(jié)點(diǎn)類 Node ,定義抽象方法 public abstract void print(); 定義葉子節(jié)點(diǎn)類 LeafNode ,繼承Node節(jié)點(diǎn),實(shí)現(xiàn) print() 抽象方法,葉子節(jié)點(diǎn)沒有子節(jié)點(diǎn) 定義子節(jié)點(diǎn)類 BranchNode ,繼承Node節(jié)點(diǎn),實(shí)現(xiàn) print() 抽象方法,子節(jié)點(diǎn)既可以有子節(jié)點(diǎn),也又可以有葉子節(jié)點(diǎn) 定義一個樹狀目錄結(jié)構(gòu)

    2024年01月18日
    瀏覽(20)
  • (二)結(jié)構(gòu)型模式:4、組合模式(Composite Pattern)(C++實(shí)例)

    (二)結(jié)構(gòu)型模式:4、組合模式(Composite Pattern)(C++實(shí)例)

    目錄 1、組合模式(Composite Pattern)含義 2、組合模式應(yīng)用場景 3、組合模式的優(yōu)缺點(diǎn) 4、組合模式的UML圖學(xué)習(xí) 5、C++實(shí)現(xiàn)組合模式的簡單示例(公司的OA系統(tǒng)) 1、組合模式(Composite Pattern)含義 組合模式(Composite Pattern),又叫部分整體模式,是用于把一組相似的對象當(dāng)作一個

    2024年02月12日
    瀏覽(18)
  • Java設(shè)計(jì)模式之建造者模式詳解(Builder Pattern)

    在日常的開發(fā)工作中,我們常常需要創(chuàng)建一些復(fù)雜的對象。這些對象可能包含許多不同的屬性,并且這些屬性的初始化過程可能相當(dāng)復(fù)雜。在這種情況下,建造者模式是一種非常有用的設(shè)計(jì)模式,因?yàn)樗试S我們分步驟地創(chuàng)建復(fù)雜的對象。 概念和原理: 建造者模式(Builder

    2024年02月09日
    瀏覽(25)
  • Java設(shè)計(jì)模式之過濾器模式(Filter Pattern)

    過濾器模式(Filter Pattern)是一種常用的設(shè)計(jì)模式,它用于通過一系列條件來過濾對象集合,并將滿足條件的對象保留下來。該模式可以幫助我們在不修改原始對象集合的情況下,根據(jù)特定的條件對集合進(jìn)行篩選和處理。 在過濾器模式中,通常有三個核心角色: 過濾器接口(

    2024年02月07日
    瀏覽(20)
  • Java設(shè)計(jì)模式-組合模式

    在軟件設(shè)計(jì)中,設(shè)計(jì)模式是一種被廣泛接受和應(yīng)用的經(jīng)驗(yàn)總結(jié),旨在解決常見問題并提供可復(fù)用的解決方案。 組合模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,它允許將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu)。這種模式能夠使客戶端以一致的方式處理單個對象和對象集合,將

    2024年02月06日
    瀏覽(27)
  • 03-JAVA設(shè)計(jì)模式-組合模式

    03-JAVA設(shè)計(jì)模式-組合模式

    組合模式(Composite Pattern)允許你將對象組合成樹形結(jié)構(gòu)以表示“部分-整體”的層次結(jié)構(gòu),使得客戶端以統(tǒng)一的方式處理單個對象和對象的組合。組合模式讓你可以將對象組合成樹形結(jié)構(gòu),并且能像單獨(dú)對象一樣使用它們。 把部分和整體的關(guān)系用樹形結(jié)構(gòu)來表示,從而是客戶

    2024年04月11日
    瀏覽(19)
  • Java組合設(shè)計(jì)模式

    組合模式(Composite Pattern),又叫部分整體模式,它創(chuàng)建了對象組的樹形結(jié)構(gòu),將對象組合成樹狀結(jié)構(gòu)以表示“整體-部分”的層次關(guān)系。組合模式依據(jù)樹狀結(jié)構(gòu)來組合對象,用來表示部分以及整體層次。這種設(shè)計(jì)模式屬于結(jié)構(gòu)性模式。組合模式使得用戶對單個對象和組合對象

    2024年02月15日
    瀏覽(33)
  • Java23種設(shè)計(jì)模式-結(jié)構(gòu)型模式之組合模式

    組合模式 (Composite Pattern):將 對象組合成樹狀結(jié)構(gòu) 以表示“ 部分-整體 ”層次結(jié)構(gòu),同時保持對單個對象和組合對象的一致性操作,主要目的是簡化客戶端代碼,因?yàn)樗梢越y(tǒng)一處理單個對象和組合對象。 通常包含以下幾個角色: 角色1. 抽象組件 (Component):聲明了 組

    2024年04月26日
    瀏覽(28)
  • Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    Java設(shè)計(jì)模式之結(jié)構(gòu)型-組合模式(UML類圖+案例分析)

    目錄 一、基礎(chǔ)概念 二、UML類圖 三、角色設(shè)計(jì) 四、案例分析 4.1、基本實(shí)現(xiàn) 4.2、菜單遍歷? 五、總結(jié)? 組合模式(Composite Pattern)又叫部分-整體模式,它通過將對象組合成樹形結(jié)構(gòu)來表示“整體-部分”的層次關(guān)系,允許用戶統(tǒng)一單個對象和組合對象的處理邏輯。 角色 描述

    2024年02月16日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包