java设计模式——结构型模式——组合模式

结构型模式——组合模式

组合模式概述

组合模式用于把一组相似的对象当作一个单一的对象,组合模式依据树形结构来组合对象,用来表示部分以及整体层次。它创建了树形结构。

组合模式结构

组合模式有一下组成角色:

  • 抽象根节点;定义刺痛各层次对象的共有方法和属性,可以预先定义一些默认行为和属性。
  • 树枝节点:定义树枝节点的行为,存储子节点,组合树枝节点和叶节点形成一个树形结构。
  • 叶子结点:叶子结点对象,其下再无分枝,是系统层次遍历的最小单位。

组合模式实现

组合模式类似于构建了一棵树,这棵树上的叶子结点类和非叶子结点类都继承自同一个“抽象根结点”类,这样对与叶子结点类和非叶子结点类都可以进行相同的操作。树枝节点类和叶子结点类都只实现自己需要的方法即可。

/**
 * MenuComppnent类是抽象根结点
 */
public abstract class MenuComponent {
    protected String name;
    protected int level;
    
    public void add(MenuComponent menuComponent){
        throw new UnsupportedOperationException();
    }
    
    public void remove(MenuComponent menuComponent){
        throw new UnsupportedOperationException();
    }
    
    public MenuComponent getChild(int i){
        throw new UnsupportedOperationException();
    }
    
    public String getName(){
        return name;
    }
    
    public void print(){
        throw new UnsupportedOperationException();
    }
}
/**
 * Menu类是树枝结点
 */
public class Menu extends MenuComponent{
    private List<MenuComponent> menuComponentList;

    public Menu(String name,int level){
        this.level = level;
        this.name = name;
        menuComponentList = new ArrayList<>();
    }

    @Override
    public void add(MenuComponent menuComponent) {
        menuComponentList.add(menuComponent);
    }

    @Override
    public void remove(MenuComponent menuComponent) {
        menuComponentList.remove(menuComponent);
    }

    @Override
    public MenuComponent getChild(int i) {
        return menuComponentList.get(i);
    }

    @Override
    public void print() {
        for (int i=1;i<level;i++){
            System.out.println("--");
        }
        System.out.println(name);
        for (MenuComponent menuComponent : menuComponentList) {
            menuComponent.print();
        }
    }
}
/**
 * MenuItem类是叶子结点
 */
public class MenuItem extends MenuComponent{
    public MenuItem(String name,int level) {
        this.name = name;
        this.level = level;
    }

    @Override
    public void print() {
        for (int i=1;i<level;i++){
            System.out.println("--");
        }
        System.out.println(name);
    }
}

组合模式分类

在使用组合模式是,根据抽象构件类的定义形式,可以将组合模式分为透明组合模式和安全组合模式,

  • 透明组合模式:透明组合模式中,抽象根节点角色声明类所有管理成员对象的方法,比如上述实例中,抽象根节点包括树枝节点和叶子结点的全部方法。这样的好处是,可以确保所有的构件类都有相同的接口。透明组合模式也是组合模式的标准形式,但是透明组合模式的缺点是不够安全,因为叶子对象和容器对象在本质上还是有区别的,叶子对象不可能有下一层次的对象,即不可能包含成员对象,所以在抽象根节点类中需要为方法提供异常处理。
  • 安全组合模式:在安全组合模式中,在抽象构件角色中没有声明任何管理成员对象的方法,而是在树枝及诶单Menu类中声明并实现这些方法。安全组合模式的缺点是不够透明,因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件类中定义,因此客户端不能完全针对抽象编程,必须有区别的对待叶子构件和容器构件,违背了组合模式的初衷。

组合模式优点

  • 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或者部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制。
  • 客户端可以一致的使用一个组合构件或者其中单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码。
  • 在组合模式中增加新的树枝节点和叶子结点很方便,无须对现有类库进行任何修改,符合“开闭原则”。
  • 组合模式为属性结构的面相对象实现提供了一种灵活的解决方案,通过叶子结点和树枝觉点的递归组合,可以形成复杂的属性结构,但对树形结构的控制却很简单。

文章内容为个人学习总结,如有错误望指正。
参考链接https://www.bilibili.com/video/BV1Np4y1z7BU

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值