java23种设计模式-组合器模式

26 篇文章 0 订阅
22 篇文章 0 订阅
定义

将对象组合成树形结构以表示“部分整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。–GoF《设计模式》

UML

角色
  • Component: 组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component子部件。
  • Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点。
  • Composite: 定义有枝节点行为,用来存储子部件,在Component接口中实现与子部件有关操作,如增加(add)和删除(remove)等。
适用性

以下情况下适用组合模式:

  • 你想表示对象的部分-整体层次结构
  • 你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。
示例
/**
 * desc : 组合接口
 * Created by tiantian on 2018/10/16
 */
public interface Component {
    void display();
    void add(Component component);
    void remove(Component component);
}
/**
 * desc : 具有支节点的具体组合类
 * Created by tiantian on 2018/10/16
 */
public class Composite implements Component{
    private List<Component> subComposite = new ArrayList<>();
    @Override
    public void display() {
        System.out.println("I'm Composite, i have sub Composite");
    }

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

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


/**
 * desc : 无支节点的叶子组合类
 * Created by tiantian on 2018/10/16
 */
public class Leaf implements Component{
    @Override
    public void display() {
        System.out.println("I'm Leaf,i have no Composite");
    }

    @Override
    public void add(Component component) {
        // nothing to do
    }

    @Override
    public void remove(Component component) {
        // nothing to do
    }
}

public class Client {
    public static void main(String[] args) {
        Component father = new Composite();
        father.add(new Composite());
        father.display();
        
        Component leaf = new Leaf();
        leaf.display();
        father.add(leaf);
    }
    // output:
    // I'm Composite, i have sub Composite
    // I'm Leaf,i have no Composite
}

例子中的father可以有很多子节点(孩子),同时子节点又可以有若干子节点,以此类推

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值