组合模式(Composite Pattern)

1、概述
组合模式是一种树形结构,每个节点可以看作一个对象,在一个对象中又包含其他对象,这些被包含的对象可能是终点对象(叶子结点),也有可能是非终点对象(也叫组对象或者非叶子结点)。
组合多个对象形成树形结构以表示具有“整体—部分”关系的层次结构。组合模式对单个对象(即叶子对象)和组合对象(即容器对象)的使用具有一致性,组合模式又可以称为“整体—部分”(Part-Whole)模式,它是一种对象 结构型模式。
在组合模式结构图中包含如下几个角色:
  • Component(抽象构件):它可以是接口抽象类,为叶子构件和容器构件对象声明接口,在该角色中可以包含所有子类共有行为的声明和实现。在抽象构件中定义了访问及管理它的子构件的方法,如增加子构件、删除子构件、获取子构件等。
  • Leaf(叶子构件):它在组合结构中表示叶子节点对象,叶子节点没有子节点,它实现了在抽象构件中定义的行为。对于那些访问及管理子构件的方法,可以通过异常等方式进行处理。
  • Composite(容器构件):它在组合结构中表示容器节点对象,容器节点包含子节点,其子节点可以是叶子节点,也可以是容器节点,它提供一个集合用于存储子节点,实现了在抽象构件中定义的行为,包括那些访问及管理子构件的方法,在其业务方法中可以递归调用其子节点的业务方法。
2、优缺点
优点: 1、高层模块调用简单。 2、节点自由增加。
缺点:在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
3、场景
场景:部分、整体场景,如树形菜单,文件、文件夹的管理。
4、实例

public class Noder {
private String name ;
public Noder( String name ) {
this . name = name ;
}
List < Noder > noderList = new ArrayList < Noder >();
public void add ( Noder noder ) {
noderList . add ( noder );
}
public void remove ( Noder noder ) {
noderList . remove ( noder );
}
public List < Noder > getNoderList () {
return noderList ;
}
@Override
public String toString () {
return "Noder{" +
"name='" + name + ' \' ' +
", noderList=" + noderList +
'}' ;
}
}

public class CompositePatternDemo {
public static void main ( String [] args ) {
Noder noder = new Noder ( "顶级文件夹" );
Noder noderLeft = new Noder ( "左文件夹" );
Noder noderRight = new Noder ( "右文件夹" );
noder . add ( noderLeft );
noder . add ( noderRight );

Noder leaf1 = new Noder ( "叶子节点1" );
Noder leaf2 = new Noder ( "叶子节点2" );
noderLeft . add ( leaf1 );
noderRight . add ( leaf2 );

List < Noder > noderList = noder . getNoderList ();
for ( Noder temp : noderList ) {
System . out . println ( temp . toString ());;
}
}
}

增加节点:左文件夹
增加节点:右文件夹
增加节点:叶子节点1
增加节点:叶子节点2
Noder{name='左文件夹', noderList=[Noder{name='叶子节点1', noderList=[]}]}
Noder{name='右文件夹', noderList=[Noder{name='叶子节点2', noderList=[]}]}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值