设计模式基础篇-13-组合模式(Composite Pattern)

组合模式,将单个对象和组合对象按照完全一样的事物对待,其实就是将一类东西组合在一起,通过条件,选择性的输出;

举个列子: 一个公司旗下,有很多部门,比如it部门,hr部门,等,我现在想知道it部门有多人,这代码怎么写,这个时候使用组合模式就不错

1. 定义抽象类

1.1 抽象类- 公司

/**
 * 总部组织
 *
 * @author wangqinglong01
 */
public abstract class HeadQuarters {

    /**
     * 部门名称
     */
    private String name;

    HeadQuarters(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public abstract void add(HeadQuarters headQuarters);

    public abstract HeadQuarters getChild(String orgName);

    public abstract int getStaffCount();

    @Override
    public String toString() {
        return name;
    }
}

1.2 实现类-公司


import java.util.ArrayList;
import java.util.List;

/**
 * 组合实现类  公司下面的部门
 *
 * @author wangqinglong01
 */
public class HeadQuartersImpl extends HeadQuarters {


    private List<HeadQuarters> headQuarters = new ArrayList<>();

    HeadQuartersImpl(String name) {
        super(name);
    }

    @Override
    public void add(HeadQuarters headQuarters) {
        this.headQuarters.add(headQuarters);
    }

    @Override
    public HeadQuarters getChild(String orgName) {
        for (HeadQuarters org : headQuarters) {
            HeadQuarters targetOrg = org.getChild(orgName);
            if (targetOrg != null) {
                return targetOrg;
            }
        }
        return null;
    }

    @Override
    public int getStaffCount() {
        int count = 0;
        for (HeadQuarters headQuarters : this.headQuarters) {
            count += headQuarters.getStaffCount();
        }
        return count;
    }
}

1.3 实现类- 公司旗下的it部门

/**
 * it部门
 *
 * @author wangqinglong01
 */
public class ItDepartment extends HeadQuarters {

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

    /**
     * 返回部门人数
     *
     * @return 部门人数
     */
    @Override
    public int getStaffCount() {
        return 20;
    }

    @Override
    public void add(HeadQuarters headQuarters) {
        throw new UnsupportedOperationException(this.getName() + "已经是最基本部门,无法增加下属部门");
    }

    @Override
    public HeadQuarters getChild(String orgName) {
        if (getName().equals(orgName)) {
            return this;
        }
        return null;
    }
}

1.4 客户端

调用 listOrgInfo 即可

/**
 * 组合模式客户端
 *
 * @author wangqinglong01
 */
public class HeadQuartersClient {

    private HeadQuarters constructOrganization() {

        //构建总部
        HeadQuartersImpl head = new HeadQuartersImpl("总公司");
        ItDepartment headIt = new ItDepartment("总公司It部");
        head.add(headIt);

        //构建分公司
        HeadQuartersImpl branch1 = new HeadQuartersImpl("天津分公司");
        ItDepartment branch1It = new ItDepartment("天津分公司It部");
        branch1.add(branch1It);

        //将分公司加入到head中
        head.add(branch1);
        return head;
    }

    public void listOrgInfo() {
        HeadQuarters org = constructOrganization();
        System.out.println(String.format("%s共有%d名员工",
                org.getName(), org.getStaffCount()));

        HeadQuarters subOrg = org.getChild("天津分公司行政部");
        System.out.println(String.format("%s共有%d名员工",
                subOrg.getName(), subOrg.getStaffCount()));
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alan0517

感谢您的鼓励与支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值