组合模式

组合模式

组合模式(Composite Pattern)有时候又叫做部分-整体模式,允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

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

组合模式主要涉及到几个对象:

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

UML图

树形结构:

组合模式比较复杂,一般有以下用途:

 
    1.你想表示对象的部分-整体层次结构
  2.你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

要点

  1. 组合模式提供一个结构,可同时包含个别对象和组合对象。
  2. 组合模式允许客户对个别对象以及组合对象一视同仁。
  3. 组合结构内的任意对象成为组件,组件可以是组合,也可以是叶节点。
  4. 实现组合模式时,有许多设计上的折中。你要根据需要平衡透明性和安全性。

例子:

public abstract class Company {
    private String name;  

    public Company(String name) {
        this.name = name;
    }  

    public Company() {
    }  

    public String getName() {
        return name;
    }  

    public void setName(String name) {
        this.name = name;
    }  

    protected abstract void add(Company company);  

    protected abstract void romove(Company company);  

    protected abstract void display(int depth);
}  

public class ConcreteCompany extends Company {
    private List<Company> cList;  

    public ConcreteCompany() {
        cList = new ArrayList<Company>();
    }  

    public ConcreteCompany(String name) {
        super(name);
        cList = new ArrayList<Company>() ;
    }  

    @Override
    protected void add(Company company) {
        cList.add(company);
    }  

    @Override
    protected void display(int depth) {
        // TODO Auto-generated method stub
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(new String(sb) + this.getName());
        for (Company c : cList) {
            c.display(depth + 2);
        }
    }  

    @Override
    protected void romove(Company company) {
        cList.remove(company);
    }
} 
public class FinanceDepartment extends Company {  

    public FinanceDepartment(){  

    }  

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

    @Override
    protected void add(Company company) {  

    }  

    @Override
    protected void display(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(new String(sb) + this.getName() ) ;
    }  

    @Override
    protected void romove(Company company) {  

    }  

}  
public class HRDepartment extends Company {  

    public HRDepartment(){  

    }  

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

    @Override
    protected void add(Company company) {  

    }  

    @Override
    protected void display(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(new String(sb) + this.getName() ) ;
    }  

    @Override
    protected void romove(Company company) {  

    }  

}  

public class Client {  

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Company root = new ConcreteCompany();
        root.setName("北京总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new FinanceDepartment("总公司财务部"));
        Company shandongCom = new ConcreteCompany("山东分公司");
        shandongCom.add(new HRDepartment("山东分公司人力资源部"));
        shandongCom.add(new FinanceDepartment("山东分公司账务部"));
        Company zaozhuangCom = new ConcreteCompany("枣庄办事处");
        zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));
        zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));
        Company jinanCom = new ConcreteCompany("济南办事处");
        jinanCom.add(new FinanceDepartment("济南办事处财务部"));
        jinanCom.add(new HRDepartment("济南办事处人力资源部"));
        shandongCom.add(jinanCom);
        shandongCom.add(zaozhuangCom);
        Company huadongCom = new ConcreteCompany("上海华东分公司");
        huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));
        huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));
        Company hangzhouCom = new ConcreteCompany("杭州办事处");
        hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));
        hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));
        Company nanjingCom = new ConcreteCompany("南京办事处");
        nanjingCom.add(new FinanceDepartment("南京办事处财务部"));
        nanjingCom.add(new HRDepartment("南京办事处人力资源部"));
        huadongCom.add(hangzhouCom);
        huadongCom.add(nanjingCom);
        root.add(shandongCom);
        root.add(huadongCom);
        root.display(0);
    }  

}  
时间: 2024-09-21 20:13:08

组合模式的相关文章

.net设计模式实例之组合模式(Composite Pattern)

一.组合模式简介(Brief Introduction) 组合模式,将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户 对单个对象和组合对象的使用具有一致性. 二.解决的问题(What To Solve) 解决整合与部分可以被一致对待问题. 三.组合模式分析(Analysis)1.组合模式结构 Component类:组合中的对象声明接口,在适当情况下,实现所有类共有接口的行为.声 明一个接口用于访问和管理Component的子部件 Leaf类:叶节点对象,叶节点没有子

php设计模式 Composite (组合模式)

复制代码 代码如下: <?php /** * 组合模式 * * 将对象组合成树形结构以表示"部分-整体"的层次结构,使得客户对单个对象和复合对象的使用具有一致性 */ abstract class MenuComponent { public function add($component){} public function remove($component){} public function getName(){} public function getUrl(){} p

.NET中的设计模式三:组合模式

设计 组合模式(Composite)是一种"结构型"模式(Structural).结构型模式涉及的对象为两个或两个以上,表示对象之间的活动,与对象的结构有关. 先举一个组合模式的小小例子: 如图:系统中有两种Box:Game Box和Internet Box,客户需要了解者两个类的接口分别进行调用.为了简化客户的工作,创建了XBox类,程序代码如下: GameBox的代码: public class GameBox { public void PlayGame() { Console.

设计模式学习:组合模式

介绍: 想必你已经了解了数据结构中的树,ok,组合模式对于你就是一会儿的功夫了.组合模式相对来说比较简单.看一下定义 组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构.使得用户对单个对象和组合对象的使用具有一致性. 暂时没有想到好的例子,如果你有,请告诉我.下面我用树来对组合模式进行解释.树的结构是下面的这样的: 没棵树有一个根节点,也有叶子节点和树枝节点,一些结构都是用树结构表示的,例如树形菜单,文件和文件夹目录.那么如何存储管理这样的树结构,可以组合模式来解决. 组合模

设计模式的C++实现之组合模式

解决的问题: 我们PC用到的文件系统,其实就是我们数据结构里的树形结构,我们处理树中的每个节点时,其实 不用考虑他是叶子节点还是根节点,因为他们的成员函数都是一样的,这个就是组合模式的精髓.他模糊了简单元素和复杂 元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 将 对象组合成树形结构以表示"部分-整体"的层次结构.组合模式使得用户对单个对象和组合对象的使用具有一致性. 注明:树形结构里的叶子节点也有左右孩子,只不过他的孩子都是空.

hand first设计模式 -组合模式-1

组合模式:允许你将对象组成树形结构来表现"整体/部份"的层次结构.组合能让客户以一致的方式处理个别对象和对象组合. 下面程序的目的是打印所有菜单和子菜单的信息. 菜单和子菜单都继承自MenuComponent,所以在打印信息的时候以一致的方式处理(见组合模式定义). 菜单组件抽象类 Java代码 public abstract class MenuComponent { //添加菜单组件 public void add(MenuComponent menuComponent) { th

.NET设计模式(11):组合模式(Composite Pattern)

概述 组合模式有时候又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦. 意图 将对象组合成树形结构以表示"部分-整体"的层次结构.Composite模式使得用户对单个对象和组合对象的使用具有一致性.[GOF <设计模式>] 结构图 图1 Composite模式结构图 生活中的例子 组合模式将对象组合成树形结构以表示"部分-整体"的层次结构

iOS设计模式之组合模式

组合模式(Composite) 基本理解 整体和部分可以一直对待. 组合模式:将对象组合成树形结构以表示"部分--整体"的层次结构.组合模式使得用户对单个对象和组合独享的使用具有一致性. 透明方式和安全方式 透明方式:在Component(为组合中的对象声明接口)中声明所有用来管理子对象的方法 .这样实现该接口的子类都具有了该接口中的方法.这样的好处就是叶节点和枝节点对于外界没有区别,他们具有完全一致的行为接口.但问题也很明显,因为Leaf类本身不具备添加删除方法的功能,所以实现它是没

深入理解JavaScript系列(40):设计模式之组合模式详解_基础知识

介绍 组合模式(Composite)将对象组合成树形结构以表示"部分-整体"的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性. 常见的场景有asp.net里的控件机制(即control里可以包含子control,可以递归操作.添加.删除子control),类似的还有DOM的机制,一个DOM节点可以包含子节点,不管是父节点还是子节点都有添加.删除.遍历子节点的通用功能.所以说组合模式的关键是要有一个抽象类,它既可以表示子元素,又可以表示父元素. 正文 举个例子,有家餐厅提

Android设计模式系列之组合模式_Android

Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类. 组合模式,Composite Pattern,是一个非常巧妙的模式.几乎所有的面向对象系统都应用到了组合模式. 1.意图 将对象View和ViewGroup组合成树形结构以表示"部分-整体"的层次结构(View可以做为ViewGroup的一部分). 组合模式使得用户对单个对象View和组合对象ViewGrou