设计模式学习笔记之组合模式

本文介绍了一种设计模式——组合模式,该模式允许将对象组织成树形结构,以便表示整体与部分的关系。通过组合模式,可以方便地添加或删除子节点,并且能够忽略组合对象与个体对象之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

组合模式

    允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
    使用组合结构,我们能把相同的操作应用在组合和个别对象上。换句话说,在大多数情况下,我们可以忽略对象组合和个别对象之间的差别。
     说明:
    1、组合模式使添加或者删除子节点变得容易;
     场景:
    1、想要标识对象的部分-整体结构;
    2、想要客户端忽略组合对象和个体对象的差异,客户端将统一使用组合结构中的所有对象;
 
/**
 * 为组合中所有对象定义一个接口,不管是组合还是节点
 * */
public abstract class Component {
 
    public void add(Component component) {
        new UnsupportedOperationException();
    }
 
    public void remove(Component component) {
        new UnsupportedOperationException();
    }
 
    public String getName() {
        return null;
    }
 
    public void foreach(){
        new UnsupportedOperationException();
    }
}
/**
 * 子节点
 * */
public class Leaf extends Component{
 
    String name;
 
    public Leaf(String name) {
        this.name = name;
    }
 
    @Override
    public void add(Component component) {
        System.out.println("不存在子节点,无法添加。。。");
    }
 
    @Override
    public void remove(Component component) {
        new UnsupportedOperationException();
    }
 
    @Override
    public String getName() {
        return name;
    }
 
}
/**
 * 组合类
 * */
public class Composite extends Component{
 
    String name;
    private List<Component> child = new ArrayList<Component>();
 
    public Composite(String name) {
        this.name = name;
    }
 
    @Override
    public void add(Component component) {
        child.add(component);
    }
 
    @Override
    public void remove(Component component) {
        child.remove(component);
    }
 
    @Override
    public void foreach(){
        for(Component component : child) {
            System.out.println(component.getName());
        }
    }
 
    @Override
    public String getName() {
        return name;
    }
}
public class Client {
 
    public static void main(String[] args) {
        Component component = new Composite("根节点");
        Component child = new Composite("一级子节点child");
        Component child_1 = new Leaf("一级子节点child之子节点一");
        Component child_2 = new Leaf("一级子节点child之子节点二");
        child.add(child_1);
        child.add(child_2);
        Component child2 = new Composite("一级子节点child2");
        component.add(child);
        component.add(child2);
        component.foreach();
    }
 
}
参考资料:《Head First 设计模式》

转载于:https://www.cnblogs.com/LeslieXia/p/5494896.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值