结构设计模式:复合模式

以前,我们检查了适配器模式的用例和桥接模式。 我们将在本文中研究的模式是复合模式。

通过遵循复合模式,我们可以将对象“组成”为代表整个部分层次结构的树结构,因此客户可以统一对待各个对象和组成。

通过引用层次结构一词,首先想到的是组织。 军事组织是复合模式的一个很好的例子。

军事人员最基本的行动之一就是执行命令。
因此,我们将创建一个接口,该接口指定执行订单的能力。

package com.gkatzioura.design.structural.composite;

public interface MilitaryPersonnel {

    void executeOrder();

}

私人是军事组织中最低的职位。 私人不能委托任务或下达命令。 因此,他将只执行命令。

package com.gkatzioura.design.structural.composite;

public class Private implements MilitaryPersonnel {

    @Override
    public void executeOrder() {

    }

}

在私人之上,还有其他军衔,如少校,中尉,上校等。这些军官是军衔,军官执行命令,但他们也可以分配命令。

因此,官员界面将指定分配订单的功能。

package com.gkatzioura.design.structural.composite;

public interface Officer {

    void assignOrder();

}

请注意,为了执行命令,军官将自己采取一些行动,并且不妨将一些命令分配给低级人员。

因此,中尉将能够执行命令,但也可以将命令分配给比他低的命令。

package com.gkatzioura.design.structural.composite;

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

public class Lieutenant implements MilitaryPersonnel, Officer {

    private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();

    public Lieutenant(List<MilitaryPersonnel> lowerRankersonel) {
        this.lowerRankersonel = lowerRankersonel;
    }

    public void addPrivateUnderCommand(Private soldier) {
        lowerRankersonel.add(soldier);
    }
    
    @Override
    public void executeOrder() {
        
        //other actions

        assignOrder();

        //other actions.
    }

    @Override
    public void assignOrder() {

        lowerRankersonel.forEach(lr->lr.executeOrder());
    }
}

适用于中尉的规定也适用于能够执行命令并将命令分配给较低级别​​的专业。

package com.gkatzioura.design.structural.composite;

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

public class Colonel implements MilitaryPersonnel, Officer {

    private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();

    public Colonel(List<MilitaryPersonnel> lowerRankersonel) {
        this.lowerRankersonel = lowerRankersonel;
    }

    public void addPrivateUnderCommand(Private soldier) {
        lowerRankersonel.add(soldier);
    }

    public void addLieutenantUnderCommand(Lieutenant lieutenant) {
        lowerRankersonel.add(lieutenant);
    }

    @Override
    public void executeOrder() {
        //other actions

        assignOrder();

        //other actions
    }

    @Override
    public void assignOrder() {
        lowerRankersonel.forEach(lr->lr.executeOrder());
    }
}

在我们的场景中,将军是最高级别的,因此当他分配一个订单时,该订单将由我们实现的组合执行。

package com.gkatzioura.design.structural.composite;

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

public class General implements  Officer {

    private List<MilitaryPersonnel> lowerRankersonel = new ArrayList<>();

    public General(List<MilitaryPersonnel> lowerRankersonel) {
        this.lowerRankersonel = lowerRankersonel;
    }

    @Override
    public void assignOrder(MilitaryPersonnel militaryPersonnel) {
        militaryPersonnel.executeOrder();
    }
}

一个主类将显示组合的功能。

package com.gkatzioura.design.structural.composite;

import java.util.Collections;

public class CompositeScenario {

    public static void main(String[] args) {

        Private ryan = new Private();
        Lieutenant lieutenant = new Lieutenant(Collections.singletonList(ryan));
        Major major = new Major(Collections.singletonList(lieutenant));
        General general = new General();
        general.assignOrder(major);
    }
}

如您所见,通用对象是客户端统一对待所有对象的对象。

整个层次结构以树结构表示。

私有是主要的叶子,副将代表将请求转发到相应子组件的Composite。

您可以在github上找到源代码。

翻译自: https://www.javacodegeeks.com/2018/08/structural-design-composite-pattern.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值