组合模式

本文深入探讨了组合模式,一种允许统一处理复杂对象结构的设计模式。它通过递归组合创建树形结构,使用户能以一致的方式处理单个对象或对象组合。文章详细介绍了组合模式的角色划分、实现方式以及透明和安全组合模式的区别。

目录

组合模式

组合模式概述

组合模式的结构

组合模式实现

透明组合模式与安全组合模式

组合模式优缺点与适用环境


组合模式

组合模式关注那些包含叶子构件和容器构件的结构以及它们的组织形式,在叶子构件中不包含对象,而容器构件中可以包含成员对象,这些对象通过递归组合可构成一个树形结构.组合模式使用面向对象的方式来处理树形结构,它为叶子构件和容器构件提供了一个公共的抽象构件类,客户端可以针对抽象构件进行处理,而无须关心锁操作的是叶子构件还是容器构件.

组合模式概述

组合模式通过一种巧妙的设计方案使得用户可以一致性地处理整个树形结构或者树形结构的一部分,它描述了如何将容器对象和叶子对象进行递归组合,使得用户在使用时无须对它们进行区分,可以一致地对待容器对象和叶子对象.

组合模式:组合多个对象形成树形结构以表示具有部分-整体关系的层次结构.组合模式让客户端可以统一对待单个对象和组合对象.

组合模式又称为"部分-整体"模式,属于对象结构型模式,它将对象组织到树形结构中,可以用来描述整体和部分的关系.

组合模式的结构

组合模式包含3个角色:

  1. 抽象构件.
  2. 叶子构件.
  3. 容器构件.

组合模式实现

抽象构件

public abstract class Component{
    public abstract void add(Component c);         //增加成员
    public abstract void remove(Component c);      //删除成员
    public abstract Component getChild(int i);     //获取成员
    public abstract void operation();              //业务方法
}

叶子构件

public class Leaf extends Component{
    public void add(Component c){
        //异常处理或错误提示
    }         
    
    public void remove(Component c){
        //异常处理或错误提示
    }

    public Component getChild(int i){
        //异常处理或错误提示
        return null;
    }
    
    public void operation(){
        //叶子构件具体业务方法的实现
    }
}

容器构件

import java.util.*;

public class Composite extends Component{
    private ArrayList<Component> list = new ArrayList<Component>();

    public void add(Component c){
        list.add(c);
    }         
    
    public void remove(Component c){
        list.remove(c);
    }

    public Component getChild(int i){
        return (Component)list.get(i);
    }
    
    public void operation(){
        //容器构件具体业务方法的实现,将递归调用成员构件的业务方法
        for(Object obj:list){
            ((Component)obj).operation();
        }
    }
}

在组合模式结构中,由于容器构件中仍然可以包含容器构件,因此在对容器构件进行处理时需要使用递归算法,即在容器构件的operation()方法中递归调用其成员构件的operation()方法.

透明组合模式与安全组合模式

组合模式根据抽象构件类的定义形式又可以分为透明组合模式安全组合模式.

透明组合模式中,抽象构件中声明了所有用于管理成员对象的方法,这样做的好处是确保所有的构件类都有相同的接口.在客户端看来,叶子对象与容器对象所提供的方法是一致的,客户端可以一致地对待所有的对象.

透明组合模式的缺点是不够安全,因为叶子对象和容器对象在本质上是有区别的.如果在运行阶段调用这些管理方法可能会出错(如果没有提供相应的错误处理代码).

安全组合模式中,抽象构件中没有声明任何用于管理成员对象的方法,而是在容器构件中声明并实现这些方法.这种做法是安全的,因为根本不向叶子对象提供这些管理成员对象的方法,对于叶子对象,客户端不可能调用到这些方法.

安全组合模式的缺点是不够透明,因为叶子构件和容器构件具有不同的方法,且容器构件中那些用于管理成员对象的方法没有在抽象构件中定义,因此客户端不能完全针对抽象编程,必须有区别地对待叶子构件和容器构件.

组合模式优缺点与适用环境

Java SE中的AWT和Swing包的设计就基于组合模式.

组合模式的优点:

  • 可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次,它让客户端忽略了层次的差异,方便对整个层次结构进行控制.
  • 客户端可以一致地使用一个组合结构或其中的单个对象,不必关心处理的是单个对象还是整个组合结构,简化了客户端代码.
  • 增加新的容器构件和叶子构件都很方便.

组合模式的缺点:

  • 在增加新构件时很难对容器中的构件类型进行限制.

组合模式适用环境:

  • 在具有整体和部分的层次结构中希望通过一种方式忽略整体与部分的差异,客户端可以一致地对待它们.
  • 在一个使用面向对象语言开发的系统中需要处理一个树形结构.
  • 在一个系统中能够分离出叶子对象和容器对象,而且它们的类型不固定,需要增加一些新的类型.
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值