设计模式 - 组合模式

概述

       组合模式(Composite Pattern)也称为部分整体模式,结构型设计模式之一,组合模式比较简单,它将一组相似的对象看作一个对象处理,并根据一个树状结构来组合对象,然后提供一个统一的方法去访问相对应的对象。

定义

       将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。

使用场景

  1. 表示对象的部分-整体层次结构
  2. 从一整体中能够独立出部分模块或功能的场景

UML类图

角色介绍:

Component:抽象根节点

为组合中的对象声明接口,在适当的情况下,实现所有类共有接口的缺省行为。声明一个接口用于访问和管理Component的子节点。可在递归结构中定义一个接口,用于访问一个父节点,并在合适的情况下实现它。

Composite:定义有子节点的哪些枝干节点的行为,存储子节点,在Component接口中实现与子节点有关的操作。

Leaf:在组合中表示叶子节点对象,叶子节点没有子节点,在组合中定义节点对象的行为。

Client:通过Component接口操纵组合节点的对象。

示例代码

创建抽象根节点

public abstract class Component {
    // 节点名称
    protected String name;

    public Component(String name) {
        this.name = name;
    }
    // 具体逻辑方法由子类实现
    abstract void doSomeThing();
}

创建具体枝干节点

public class Composite extends Component {
    // 存储子节点
    private List<Component> mListComponent;

    public Composite(String name) {
        super(name);
        mListComponent = new ArrayList<>();
    }

    // 具体逻辑实现
    void doSomeThing() {
        System.out.println(name);
        if (null != mListComponent && mListComponent.size() > 0) {
            for (Component component : mListComponent) {
                component.doSomeThing();
            }
        }
    }

    /**
     * 添加子节点
     * @param component 预添加的子节点
     */
    public void addComponent(Component component) {
        mListComponent.add(component);
    }

    /**
     * 移除子节点
     * @param component 预移除的子节点
     */
    public void removeComponent(Component component) {
        mListComponent.remove(component);
    }

    /**
     * 获取子节点
     * @param index 子节点的位置
     * @return
     */
    public Component getComponent(int index) {
        if (index < mListComponent.size()) {
            return mListComponent.get(index);
        }
        return null;
    }
}

创建叶子节点

public class Leaf extends Component {

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

    @Override
    void doSomeThing() {
        System.out.println(name);
    }
}

创建测试类

public class TestComponent {
    public static void main(String[] args) {
        // 创建根节点
        Composite mComposite = new Composite("Root");

        // 创建枝干节点
        Composite compositeA = new Composite("Branch-A");
        Composite compositeB = new Composite("Branch-B");

        // 创建叶子节点
        Leaf leafA = new Leaf("Leaf- A");
        Leaf leafB = new Leaf("Leaf- B");

        // 将叶子节点添加至枝干节点
        compositeA.addComponent(leafA);
        compositeA.addComponent(leafB);

        // 将枝干节点添加至根节点
        mComposite.addComponent(compositeA);
        mComposite.addComponent(compositeB);

        // 根节点执行逻辑方法
        System.out.println("--------- 根节点 - Start ---------");
        mComposite.doSomeThing();
        System.out.println("--------- 根节点 - End   ---------");
        // 枝干节点执行逻辑方法
        System.out.println("--------- 枝干节点 - Start ---------");
        compositeA.doSomeThing();
        System.out.println("--------- 枝干节点 - End   ---------");
        // 叶子节点执行逻辑方法
        System.out.println("--------- 叶子节点 - Start ---------");
        leafA.doSomeThing();
        System.out.println("--------- 叶子节点 - End   ---------");
    }
}

Log打印

--------- 根节点 - Start ---------
Root
Branch-A
Leaf- A
Leaf- B
Branch-B
--------- 根节点 - End   ---------
--------- 枝干节点 - Start ---------
Branch-A
Leaf- A
Leaf- B
--------- 枝干节点 - End   ---------
--------- 叶子节点 - Start ---------
Leaf- A
--------- 叶子节点 - End   ---------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值