设计模式之组合模式---Composite Pattern

模式的定义

组合模式(Composite Pattern)定义如下:

Compose objects into tree structures to represent part-whole hierarchies. Composite lets clients treat individual objects and compositions of objects uniformly。

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

组合模式有时叫做部分—整体模式,主要是描述部分与整体的关系。

模式的使用场景

  1. 部分-整体关系的场景,如树形菜单,文件和文件夹管理
  2. 从一个整体中能够独立出部分模块或功能的场景

UML类图

角色介绍

  • Component 抽象构件角色

定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性

  • Leaf 叶子组件

叶子对象,其下再也没有其他的分支,也就是最小的单位

  • Composite 树枝构件

树枝对象,它的作用就是组合树枝节点和叶子节点形成一个树形结构

模式的简单实现

Component:

public abstract class Component {

    //个体和整体都具有的共享
    public void doSomething(){
        //业务逻辑
        System.out.print("Component-----doSomething()");
    }
}

Leaf :

public class Leaf extends Component {

    //可以覆写父类方法
    /* (non-Javadoc)
     * @see Component#doSomething()
     */
    @Override
    public void doSomething() {
        // TODO Auto-generated method stub
        super.doSomething();
        System.out.print("Leaf-------doSomething()");
    }

    @Override
    public String toString() {
        // TODO Auto-generated method stub
        return super.toString();
    }
}

Composite :

public class Composite extends Component{

    private ArrayList<Component> components = new ArrayList<Component>();

    public void add(Component component){
        components.add(component);
    }

    public void remove(Component component){
        components.remove(component);
    }

    public ArrayList<Component> getChildren(){
        return components;
    }

}

Client:

public class Client {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        //create a root
        Composite root =  new Composite();
        root.doSomething();

        //create a branch
        Composite branch = new Composite();
        root.add(branch);

        //create a leaf
        Leaf leaf1 = new Leaf();
        root.add(leaf1);

        //create a leaf
        Leaf leaf2 = new Leaf();
        root.add(leaf2);

        Display(root);

    }

    private static void Display(Composite root) {
        // TODO Auto-generated method stub
        for(Component c:root.getChildren()){
            if(c instanceof Leaf){
                System.out.println();
                System.out.print("leaf----"+c.toString());

            }else {
                System.out.println();
                System.out.print("Composite----"+c.toString());
                Display((Composite)c);

            }
        }
    }

}

优点

  • 高层模块调用简单

一棵树形机构中的所有节点都是Component,局部和整体对调用者来说没有任何区别,也就是说高层模块不关心自己处理的是单个对象还是整个组合结构,简化了高层模块的代码

  • 节点自由增加

使用组合模式后,增加一个树枝节点,树叶节点都很容易,只要找到父节点就可以非常容易扩展,符合开闭原则,对以后的维护非常有利。

缺点

组合模式有一个明显的缺点,看我们的场景类中的定义,提到树叶与树枝使用时的定义。直接使用了实现类。这在面向接口编程上是不恰当的,与依赖倒置原则总被。

注意事项

只要是树形结构,就要考虑使用组合模式,这个一定要记住。只要是要体现局部和整体的关系的时候,而且这种关系还可能比较深,考虑一下组合模式。

Android源码中的模式实现

UML类图

具体实现代码

View.java

public class View ....{
 //此处省略无关代码...
}

ViewGroup.java

public abstract class ViewGroup extends View ...{

     private View[] mChildren;

     //增加子节点
    public void addView(View child, int index) { 

    }
    //增加子节点
    public void addView(View child) {
        addView(child, -1);
    }
    //删除子节点
    public void removeView(View view) {

    }
     //查找子节点
    public View getChildAt(int index) {
        if (index < 0 || index >= mChildrenCount) {
            return null;
        }
        return mChildren[index];
    }
}

参考资料

(1).设计模式之禅—第21章 组合模式

(2)composite Pattern 组合模式

https://github.com/simple-android-framework/android_design_patterns_analysis/tree/master/composite/tiny-times

时间: 2024-12-25 18:24:06

设计模式之组合模式---Composite Pattern的相关文章

设计模式 - 组合模式(composite pattern) 详解

组合模式(composite pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy 组合模式: 允许你将对象组合成树形结构来表现"整体/部分"层次结构. 组合能让客户以一致的方法处理个别对象以及组合对象. 建立组件类(Component), 组合类(composite)和叶子类(leaf)继承组件类, 客户类(client)直接调用最顶层的组合类(composite)即可. 具体方法: 1. 组件类(component), 包含组合

设计模式 - 组合模式(composite pattern) 迭代器(iterator) 详解

组合模式(composite pattern) 迭代器(iterator) 详解 本文地址: http://blog.csdn.net/caroline_wendy 参考组合模式(composite pattern): http://blog.csdn.net/caroline_wendy/article/details/36895627 在组合模式(composite pattern)添加迭代器功能, 遍历每一个组合(composite)的项. 具体方法: 1. 抽象组件类(abstract

设计模式之组合模式(Composite)摘录

23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而一个对象创建型模式将实例化委托给另一个对象.创建型模式有两个不断出现的主旋律.第一,它们都将关于该系统使用哪些具体的类的信息封装起来.第二,它们隐藏了这些类的实例是如何被创建和放在一起的.整个系统关于这些对象所知道的是由抽象类所定义的接口.因此,创建型模式在什么被创建,谁创建它,它是怎样被创建的,以

java_设计模式_组合模式_Composite Pattern(2016-08-12)

概念: 组合模式(Composite Pattern)将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 类图: 涉及角色: 1.Component 是组合中的对象声明接口,在适当的情况下,实现所有类共有接口的默认行为.声明一个接口用于访问和管理Component子部

组合模式(Composite Pattern)

转:http://www.cnblogs.com/doubleliang/archive/2011/12/27/2304104.html 简而言之,就是让所有的叶子节点执行相同的操作!!!!!!!!!!!!!!! 组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构

设计模式(结构型)之组合模式(Composite Pattern)

PS一句:最终还是选择CSDN来整理发表这几年的知识点,该文章平行迁移到CSDN.因为CSDN也支持MarkDown语法了,牛逼啊! [工匠若水 http://blog.csdn.net/yanbober] 阅读前一篇<设计模式(结构型)之桥接模式(Bridge Pattern)> http://blog.csdn.net/yanbober/article/details/45366781 概述 组合模式又叫做部分-整体模式,使我们在树型结构的问题中模糊简单元素和复杂元素的概念,客户程序可以像

设计模式之八:组合模式(Composite Pattern)

什么是组合模式呢?简单来说组合模式就是将对象合成树形结构以表示"部分整体"的层次结构,组合模式使用户对单个对象和组合对象使用具有一致性. 组合模式(Composite Pattern)有时候又叫部分-整体模式,它使我们在树型结构的问题中,模糊了简单元素和负责元素的概念,客户程序可以向处理简单元素一样处理负责元素,从而使得客户程序与复杂元素的的内部结构解耦. 组合模式让你可以优化处理递归或分级数据结构.关于分级数据结构的一个经典例子就是电脑中的文件系统.文件系统由目录和文件组成,所有目录

[设计模式] 7 组合模式Composite

DP书上给出的定义:将对象组合成树形结构以表示“部分-整体”的层次结构.组合使得用户对单个对象和组合对象的使用具有一致性.注意两个字“树形”.这种树形结构在现实生活中随处可见,比如一个集团公司,它有一个母公司,下设很多家子公司.不管是母公司还是子公司,都有各自直属的财务部.人力资源部.销售部等.对于母公司来说,不论是子公司,还是直属的财务部.人力资源部,都是它的部门.整个公司的部门拓扑图就是一个树形结构. 下面给出组合模式的UML图.从图中可以看到,FinanceDepartment.HRDep

【设计模式】—— 组合模式Composite

前言:[模式总览]——————————by xingoo 模式意图 使对象组合成树形的结构.使用户对单个对象和组合对象的使用具有一致性. 应用场景 1 表示对象的 部分-整体 层次结构 2 忽略组合对象与单个对象的不同,统一的使用组合结构中的所有对象. 模式结构 [安全的组合模式] 这种组合模式,叶子节点,也就是单个对象不具有对象的控制功能.仅仅有简单的业务操作. 1 package com.xingoo.composite.safe; 2 3 import java.util.ArrayLis