组合模式

组合模式

定义

组合模式又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象。组合模式依据树形结构来组合对象,用来表示部分以及整体层次。这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。
这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。

优点
- 高层模块调用简单。
- 节点自由增加。

缺点

在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。

使用场景:部分、整体场景,如树形菜单,文件、文件夹的管理。


实例

定义3个类,Component、Composite、Leaf类,Component是位于根节点的;Composite是子节点,但是同时也可以包含子节点;Leaf是子节点,不能包含子节点。

  • Component

包含3个方法,添加子节点,移除子节点,显示节点下的所有节点信息。

public abstract class Component {
    protected String name;

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

    public abstract void addChild(Component component);

    public abstract void removeChild(Component component);

    public abstract void showAll();

}
  • Composite

内部定义一个集合,用来添加、移除、遍历子节点用

public class Composite extends Component {

    private List<Component> list = new ArrayList<>();

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

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

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

    @Override
    public void showAll() {
        System.out.println("Composite " + name);
        for (Component c : list) {
            c.showAll();
        }
    }
}
  • Leaf

Leaf不能添加和移除子节点,所以对addChild和removeChild方法进行抛出异常处理。

public class Leaf extends Component {


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

    @Override
    public void addChild(Component component) {
        throw new UnsupportedOperationException("叶子节点不能有子节点");
    }

    @Override
    public void removeChild(Component component) {
        throw new UnsupportedOperationException("叶子节点不能有子节点");
    }

    @Override
    public void showAll() {
        System.out.println("Leaf " + name);
    }
}
  • main入口的使用
public class MyClass {

    public static void main(String[] args) {

        Component root = new Composite("root");

        Component subRoot = new Composite("sub root");
        Component subRoot2 = new Composite("sub root2");

        Component leaf = new Leaf("leaf");
        Component leaf2 = new Leaf("leaf2");
        Component leaf3 = new Leaf("leaf3");
        Component leaf4 = new Leaf("leaf4");

        subRoot.addChild(leaf2);
        subRoot.addChild(leaf3);
        subRoot2.addChild(leaf4);

        root.addChild(leaf);
        root.addChild(subRoot);
        root.addChild(subRoot2);

        root.showAll();
    }
}

打印结果:

Composite root
Leaf leaf
Composite sub root
Leaf leaf2
Leaf leaf3
Composite sub root2
Leaf leaf4

在Android当中View和ViewGroup就是采用组合模式

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值