设计模式之组合模式

组合模式可以用在树状结构的组合当中,把上下级对象抽象出一个基类,通过这个基类可以实现带分支的父节点,也可以实现单个末端节点。

基类用来提供添加和删除子分支的方法,尽管末端节点不需要添加分支,但还是把编辑子分支的方法统一放到基类当中省去判断节点种类。每个节点的职责可以直接抽象,或者添加一个默认实现:

public abstract class Component {
    String name;

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

    abstract void add(Component component);

    abstract void remove(Component component);

    void function(int level) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < level; i++) {
            sb.append("    ");
        }
        sb.append(name);
        System.out.println(sb.toString());
    }
}

最基本的可以只定义两种类型的实现:
带有分支的实现:

public class ParentCompany extends Component {
    private List<Component> list = new ArrayList<>();

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

    @Override
    void add(Component component) {
        list.add(component);
    }

    @Override
    void remove(Component component) {
        list.remove(component);
    }

    @Override
    void function(int level) {
        super.function(level);
        level++;
        for (int i = 0; i < list.size(); i++) {
            list.get(i).function(level);
        }
    }
}

不带分支的实现:

public class EndCompany extends Component {

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

    @Override
    void add(Component component) {
    }

    @Override
    void remove(Component component) {
    }
}

测试类:

public class Main {

    public static void main(String[] args) {

        final ParentCompany country = new ParentCompany("国家级总公司");
        final ParentCompany province = new ParentCompany("省级总公司");
        final EndCompany provinceEnd = new EndCompany("省级办事处");
        final ParentCompany city = new ParentCompany("市级总公司");
        final EndCompany cityEnd1 = new EndCompany("市级办事处1");
        final EndCompany cityEnd2 = new EndCompany("市级办事处2");
        final EndCompany townEnd = new EndCompany("镇级办事处");

        country.add(province);
        country.add(provinceEnd);
        province.add(city);
        province.add(cityEnd1);
        province.add(cityEnd2);
        city.add(townEnd);

        country.function(0);
    }
}

输出:

国家级总公司
    省级总公司
        市级总公司
            镇级办事处
        市级办事处1
        市级办事处2
    省级办事处

对于更复杂的情况可以进一步派生不同的实现,细分更多的分支和终端节点。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值