设计模式(JAVA)——Composite模式

本文深入探讨了Composite模式,一种用于处理树形结构的设计模式。通过创建包含容器和内容一致性的递归结构,使得客户端能够一致地操作单个对象或对象组合。文章详细介绍了Composite模式的角色划分,包括Leaf、Composite和Component,并提供了具体的Java实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. Composite模式

容器与内容的一致性,创造出递归结构,Composite英文意思是:“混合物”“复合物”

1.1 Composite模式的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZsPtaH6H-1573724844042)(./resources/image/11/11-1_Composite.png)]

登场角色:

  • Leaf(叶子)
    表示“内容”角色,该角色不能再放入其他对象

  • Composite(复合物)
    表示容器角色,可以放Leaf和Composite

  • Component(组件)
    表明了容器和叶子的一致性

  • Client(用户)
    使用者

1.2 示例程序

类一览表:

名字说明
Entry抽象类,表现了File类和Directory的一致性
File表示文件类
Directory表示文件夹类
FileTreatementException新建的一个异常类
Main测试类

uml类图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q3ch9lTz-1573724844043)(./resources/image/11/11-2.png)]

Entry类

package xin.ajay.composite;

public abstract class Entry {
    private String name;

    public Entry(String name) {
        this.name = name;
    }

    public String getName(){
        return name;
    }//获取名字

    public abstract int getSize();

    public Entry add(Entry entry) throws FileTreadtmentException{
        throw  new FileTreadtmentException();
    }

    public void printList(){
        printList("");
    }

    protected abstract void printList(String prefix);

    public String toString(){
        return getName() + " ("+ getSize()+")";
    }

}

File类

package xin.ajay.composite;

public class File extends Entry {
    private int size;

    public File(String name,int size) {
        super(name);
        this.size = size;
    }

    @Override
    public int getSize() {
        return size;
    }

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix + "/" + this);
    }
}

Directory类

package xin.ajay.composite;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Directory extends Entry {
    private List<Entry> directory = new ArrayList<>();

    public Directory(String name) {
        super(name);
    }

    @Override
    public int getSize() {
        int size = 0;
        for (Entry e : directory) {
            size = e.getSize();
        }
        return size;
    }

    @Override
    protected void printList(String prefix) {
        System.out.println(prefix+"/"+this);
        for (Entry e : directory) {
            e.printList(prefix+"/"+getName());
        }
    }

    @Override
    public Entry add(Entry entry) {
        directory.add(entry);
        return this;
    }
}

FileTreadtmentException类

package xin.ajay.composite;


import java.io.IOException;

public class FileTreadtmentException extends Exception {
}

Main类

package xin.ajay.composite;

public class Main {
    public static void main(String[] args) {
    /*
    --|root
    ----|bin
    ------|vi
    ------|latex
    ----|tmp
    ----|usr

    -------------------------------------------
    --|root
    ----|bin
    ------|vi
    ------|latex
    ----|tmp
    ----|usr
    ------|yuki
    --------|diary.html
    --------|Composite.java
    ------|hanako
    --------|memo.tex
    ------|tomura
    --------|game.doc
    --------|iunk.mail
     */
        System.out.println("Making root entries...");
        Directory root = new Directory("root");
        Directory bin = new Directory("bin");
        Directory tmp = new Directory("tmp");
        Directory usr = new Directory("usr");

        root.add(bin);
        root.add(tmp);
        root.add(usr);

        bin.add(new File("vi",100));
        bin.add(new File("latex",200));

        root.printList();

        System.out.println();
        System.out.println("Making user entries...");

        Directory yuki = new Directory("yuki");
        yuki.add(new File("diary.html", 10));
        yuki.add(new File("Composite.java",20));

        Directory hanako = new Directory("hanako");
        hanako.add(new File("memo.tex",11));

        Directory tomura = new Directory("tomura");
        tomura.add(new File("game.doc",12));
        tomura.add(new File("iunl.mail",13));

        usr.add(yuki);
        usr.add(hanako);
        usr.add(tomura);

        root.printList();

    }
}
鸣谢

GoF《设计模式》和结城浩的《图解设计模式》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值