Java设计模式-组合模式

文章目录

背景

地球联邦军是目前我方最大的组织,覆盖全球。旗下还有北美、南美、亚洲等联邦军,亚洲联邦军下又有教导队,我们的主角响介就是在教导队。用组合模式表示他们的树形结构如下。

实现

组织组件:可表示组织或成员

/**
 * 组织组件抽象类
 */
public abstract class OrgComponent {
    
    public void add(OrgComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    
    public void remove(OrgComponent menuComponent) {
        throw new UnsupportedOperationException();
    }
    
    public String getName() {
        throw new UnsupportedOperationException();
    }
    
    public String getDesc() {
        throw new UnsupportedOperationException();
    }
    
    public void print() {
        throw new UnsupportedOperationException();
    }
}

组织

/**
 * 组织
 */
public class Org extends OrgComponent {

    private String name;
    
    private String desc;
    
    private List<OrgComponent> orgs = new ArrayList<>();

    public Org(String name, String desc) {
        super();
        this.name = name;
        this.desc = desc;
    }

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

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public List<OrgComponent> getOrgs() {
        return orgs;
    }

    public void setOrgs(List<OrgComponent> orgs) {
        this.orgs = orgs;
    }
    
    @Override
    public void add(OrgComponent menuComponent) {
        orgs.add(menuComponent);
    }
    
    @Override
    public void remove(OrgComponent menuComponent) {
        orgs.remove(menuComponent);
    }

    @Override
    public String toString() {
        return "Org [name=" + name + ", desc=" + desc + "]";
    }
    
    @Override
    public void print() {
        System.out.println("Org [name=" + name + ", desc=" + desc + "]");
        for (OrgComponent component : orgs) {
            component.print();
        }
    }
}

成员

/**
 * 组织下的成员
 */
public class Member extends OrgComponent {

    private String name;
    
    private String desc;

    public Member(String name, String desc) {
        super();
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    @Override
    public String toString() {
        return "Member [name=" + name + ", desc=" + desc + "]";
    }
    
    @Override
    public void print() {
        System.out.println("Member [name=" + name + ", desc=" + desc + "]");
    }
}

测试

public class Test {

    public static void main(String[] args) {
        Org org = new Org("地球联邦军", "我方代表正义的一支军队");
        org.add(new Org("北美联邦军", "北美的联邦驻军"));
        org.add(new Org("欧洲联邦军", "欧洲的联邦驻军"));

        Org asianOrg = new Org("亚洲联邦军", "亚洲的联邦驻军");
        Org trainOrg = new Org("教导队", "伊豆最强的一直作战队,我们的主角响介也是在这里。");
        trainOrg.add(new Member("响介", "主角兼队长"));
        trainOrg.add(new Member("艾克塞林", "队员"));
        trainOrg.add(new Member("开", "指挥官"));
        trainOrg.add(new Member("曾加", "训练官"));
        asianOrg.add(trainOrg);

        org.add(asianOrg);
        
        org.print();
    }

}

测试结果

Org [name=地球联邦军, desc=我方代表正义的一支军队]
Org [name=北美联邦军, desc=北美的联邦驻军]
Org [name=欧洲联邦军, desc=欧洲的联邦驻军]
Org [name=亚洲联邦军, desc=亚洲的联邦驻军]
Org [name=教导队, desc=伊豆最强的一直作战队,我们的主角响介也是在这里。]
Member [name=响介, desc=主角兼队长]
Member [name=艾克塞林, desc=队员]
Member [name=开, desc=指挥官]
Member [name=曾加, desc=训练官]
总结

组合模式常用在树形结构,好像没什么好说的~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值