栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

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

1. 定义抽象类 1.1 抽象类- 公司
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;


public class HeadQuartersImpl extends HeadQuarters {


    private List 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部门
public class ItDepartment extends HeadQuarters {

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

    
    @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 即可

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()));
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/974201.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号