以前,我们检查了适配器模式的用例和桥接模式。 我们将在本文中研究的模式是复合模式。
通过遵循复合模式,我们可以将对象“组成”为代表整个部分层次结构的树结构,因此客户可以统一对待各个对象和组成。
通过引用层次结构一词,首先想到的是组织。 军事组织是复合模式的一个很好的例子。
军事人员最基本的行动之一就是执行命令。
因此,我们将创建一个接口,该接口指定执行订单的能力。
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