设计模式之组合模式

组合模式


适用场景

把部分和整体的关系用树形结构来表示,从而使客户端可以使用统一的方式对部分对象和整体对象进行管理。


基本要素

  • 抽象构件(Conponent)角色:所有类的共有接口,定义了叶子和容器的共同点。
  • 叶子(Leaf)构件角色:在组合中表示叶子结点对象,叶子节点无子节点。
  • 容器(Composite)构件角色:有容器特征,可以 用来存储子节点,在Component接口中实现与子节点有关操作,如增加(add)和删除 (remove)等。

在这里插入图片描述


使用示例


具体功能:输出当前部门及子部门的所有名称。

以学校为例,一个学校有多个学院,一个学院里有多个学科


抽象构件

/**
 * @author wzc
 * @description 抽象部门(学校,学院,学科)
 * @date 2022/6/4 16:59
 */
public abstract class AbstractDept {
    abstract void printName();
}



叶子构件

/**
 * @author wzc
 * @description 叶子节点,只有printName()业务方法。
 * @date 2022/6/4 17:00
 */
public class LeafDept extends AbstractDept {
    public String name;

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

    @Override
    void printName() {
        System.out.println(name);
    }
}



容器构件

/**
 * @author wzc
 * @description 容器构件
 * @date 2022/6/4 17:04
 */
public class CompositeDept extends AbstractDept {
    public String name;
    public List<AbstractDept> deptList = new ArrayList<>();

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

    public void add(AbstractDept leafDept) {
        deptList.add(leafDept);
    }

    public void remove(AbstractDept leafDept) {
        deptList.remove(leafDept);
    }

    public AbstractDept getChild(int index) {
        return deptList.get(index);
    }

    @Override
    void printName() {
        System.out.println("---- "+ name +" ----");
        for (AbstractDept dept : deptList) {
            dept.printName();
        }
    }
}




演示

/**
 * @author wzc
 * @description
 * @date 2022/6/4 17:10
 */
public class Client {
    public static void main(String[] args) {
        CompositeDept school = new CompositeDept("清华大学");

        CompositeDept dept1 = new CompositeDept("计算机学院");
        CompositeDept dept2 = new CompositeDept("信息工程学院");

        AbstractDept dept1_leaf1 = new LeafDept("软件工程");
        AbstractDept dept1_leaf2 = new LeafDept("网络工程");
        AbstractDept dept2_leaf1 = new LeafDept("通信工程");
        AbstractDept dept2_leaf2 = new LeafDept("信息工程");

        school.add(dept1);
        school.add(dept2);

        dept1.add(dept1_leaf1);
        dept1.add(dept1_leaf2);
        dept2.add(dept2_leaf1);
        dept2.add(dept2_leaf2);

        dept1.printName();	// 输出结果1
        school.printName();	// 输出结果2
    }
}

输出结果1:

---- 计算机学院 ----
软件工程
网络工程

输出结果2:

---- 清华大学 ----
---- 计算机学院 ----
软件工程
网络工程
---- 信息工程学院 ----
通信工程
信息工程
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值