Java设计模式--组合模式

组合模式

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

Composite Pattern

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

类图

模式的结构与使用

组合方法模式的结构中包括三种角色。
+ 抽象组件(Abstract Component):是一个接口(抽象类),该接口(抽象类)定义了个体对象和组合对象需要实现的关于操作其子节点的方法,比如add()、remove()以及getChild()等方法。抽象组件也可以定义个体对象和组合对象用于操作其自身的方法,比如isLeaf()方法等。
+ Composite(Composite Node):实现Component接口类的实例,Composite节点不仅实现Component接口,而且可以含有其他Composite节点或Leaf节点的引用。
+ Leaf节点(Leaf Node):实现Component接口类的实例,Leaf节点实现Composite接口,不可以含有其他Composite节点或Leaf节点的引用,因此,叶节点在实现Component接口有关操作子节点的方法时,比如add()、remove()和getChild()方法,可让方法抛出一个异常,也可以实现为空操作。

简单的例子

Component的接口类MilitaryPerson.java

package Component;

import java.util.Iterator;

public interface MilitaryPerson {
    public void add(MilitaryPerson person);
    public void remove(MilitaryPerson person);
    public MilitaryPerson getChild(int index);
    public Iterator<MilitaryPerson> getAllChildren();
    public boolean isLeaf();
    public double getSalary();
    public void setSalary(double salary);
}

Composite的实现类MilitaryOfficer.java

package Component;

import java.util.Iterator;
import java.util.LinkedList;

public class MilitaryOfficer implements MilitaryPerson {

    LinkedList<MilitaryPerson> list;
    String name;
    double salary;

    public MilitaryOfficer(String name, double salary) {
        this.name = name;
        this.salary = salary;
        list = new LinkedList<MilitaryPerson>();
    }

    @Override
    public void add(MilitaryPerson person) {
        list.add(person);
    }

    @Override
    public void remove(MilitaryPerson person) {
        list.remove(person);
    }

    @Override
    public MilitaryPerson getChild(int index) {
        return list.get(index);
    }

    @Override
    public Iterator<MilitaryPerson> getAllChildren() {
        return list.iterator();
    }

    @Override
    public boolean isLeaf() {
        return false;
    }

    @Override
    public double getSalary() {
        return salary;
    }

    @Override
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

Leaf的实现类MilitarySoldier.java

package Component;

import java.util.Iterator;

public class MilitarySoldier implements MilitaryPerson {

    double salary;
    String name;

    public MilitarySoldier(double salary, String name) {
        this.salary = salary;
        this.name = name;
    }

    @Override
    public void add(MilitaryPerson person) {}

    @Override
    public void remove(MilitaryPerson person) {}

    @Override
    public MilitaryPerson getChild(int index) {
        return null;
    }

    @Override
    public Iterator<MilitaryPerson> getAllChildren() {
        return null;
    }

    @Override
    public boolean isLeaf() {
        return true;
    }

    @Override
    public double getSalary() {
        return salary;
    }

    @Override
    public void setSalary(double salary) {
        this.salary = salary;
    }
}

计算工资的工具类ComputerSalary.java

package Component;

import java.util.Iterator;

public class ComputerSalary {
    public static double computerSalary(MilitaryPerson person) {
        double sum = 0;
        if (person.isLeaf() == true) {
            sum = sum + person.getSalary();
        }
        if (person.isLeaf() == false) {
            sum = sum + person.getSalary();
            Iterator<MilitaryPerson> iterator = person.getAllChildren();
            while (iterator.hasNext()) {
                MilitaryPerson p = iterator.next();
                sum = sum + computerSalary(p);
            }
        }
        return sum;
    }
}

测试类Application.java

package Component;

public class Application {

    public static void main(String[] args) {
        MilitaryPerson 连长 = new MilitaryOfficer("连长", 5000);
        MilitaryPerson 排长1 = new MilitaryOfficer("一排长", 4000);
        MilitaryPerson 排长2 = new MilitaryOfficer("二排长", 4000);
        MilitaryPerson 排长3 = new MilitaryOfficer("三排长", 4000);
        MilitaryPerson 班长11 = new MilitaryOfficer("一排长", 2000);
        MilitaryPerson 班长12 = new MilitaryOfficer("二排长", 2000);
        MilitaryPerson 班长13 = new MilitaryOfficer("三排长", 2000);
        MilitaryPerson 班长21 = new MilitaryOfficer("一排长", 2000);
        MilitaryPerson 班长22 = new MilitaryOfficer("二排长", 2000);
        MilitaryPerson 班长23 = new MilitaryOfficer("三排长", 2000);
        MilitaryPerson 班长31 = new MilitaryOfficer("一排长", 2000);
        MilitaryPerson 班长32 = new MilitaryOfficer("二排长", 2000);
        MilitaryPerson 班长33 = new MilitaryOfficer("三排长", 2000);
        MilitaryPerson[] 士兵 = new MilitarySoldier[90];
        for (int i = 0; i < 士兵.length; i++) {
            士兵[i] = new MilitarySoldier(1000, "小兵");
        }
        连长.add(排长1);
        连长.add(排长2);
        排长1.add(班长11);
        排长1.add(班长12);
        排长1.add(班长13);
        排长2.add(班长21);
        排长2.add(班长22);
        排长2.add(班长23);
        排长3.add(班长31);
        排长3.add(班长32);
        排长3.add(班长33);
        for (int i = 0; i <= 9; i++) {
            班长11.add(士兵[i]);
            班长12.add(士兵[i + 10]);
            班长13.add(士兵[i + 20]);
            班长21.add(士兵[i + 30]);
            班长22.add(士兵[i + 40]);
            班长23.add(士兵[i + 50]);
            班长31.add(士兵[i + 60]);
            班长32.add(士兵[i + 70]);
            班长33.add(士兵[i + 80]);
        }
        System.out.println("一排的军饷:" + ComputerSalary.computerSalary(排长1));
        System.out.println("一班的军饷:" + ComputerSalary.computerSalary(班长11));
        System.out.println("全连的军饷:" + ComputerSalary.computerSalary(连长));
    }
}

执行效果图

组合模式的优点

  • 组合模式中包含个体对象和组合对象,并形成树形结构,使用户可以方便地处理个体对象和组合对象。
  • 组合对象和个体对象实现了相同的接口,用户一般无须区分个体对象和组合对象。
  • 当增加新的Composite节点和Leaf节点时,用户的重要代码不需要作出修改,例如,如果增加一个创建企业领导和一般职员的Composite节点和Leaf节点,那么ComputerSalary并不需要修改,就可以计算一个部门的薪水总和。

适用组合模式的情景

  • 当想表示对象的部分-整体层次结构。
  • 希望用户用一致的方式处理个体对象和组合对象。

下载源码请到

MyGitHub

时间: 2024-11-03 02:36:57

Java设计模式--组合模式的相关文章

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

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

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

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

[Head First设计模式]生活中学设计模式——组合模式

系列文章 [Head First设计模式]山西面馆中的设计模式--装饰者模式 [Head First设计模式]山西面馆中的设计模式--观察者模式 [Head First设计模式]山西面馆中的设计模式--建造者模式 [Head First设计模式]饺子馆(冬至)中的设计模式--工厂模式 [Head First设计模式]一个人的平安夜--单例模式 [Head First设计模式]抢票中的设计模式--代理模式 [Head First设计模式]面向对象的3特征5原则 [Head First设计模式]鸭子

设计模式之禅之设计模式-组合模式

一:组合模式的定义        --->组合模式(Composite Pattern)也叫合成模式,有时又叫做部分-整体模式(Part-Whole),主要是用来描述部分与整体的关系        --->将对象组合成树形结构以表示"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. 二:组合模式的角色        ● Component抽象构件角色                定义参加组合对象的共有方法和属性,可以定义一些默认的行为或属性     

9、Python与设计模式--组合模式

一.公司结构组织 每一个公司都有自己的组织结构,越是大型的企业,其组织结构就会越复杂.大多数情况下,公司喜欢用"树形"结构来组织复杂的公司人事关系和公司间的结构关系.一般情况下,根结点代表公司的最高行政权利单位,分支节点表示一个个部门,而叶子结点则会用来代表每一个员工.每一个结点的子树,表示该结点代表的部门所管理的单位.假设一个具有HR部门,财务部门和研发部门,同时在全国有分支公司的总公司,其公司结构,可以表示成如下逻辑: class Company: name = '' def __

Java设计模式---Builder模式

之前想多写一些关于设计模式之类的东西,但是一直没写,主要是现在网上写这些的太多了,都懒的弄,反正我写这篇是写给自己做笔记的,我自己看,哼. 设计模式真的太重要了,不论是以后转学哪门语言,面向对象思想在这了,架构搭起来就会清晰些. 动手: 以前我们给model赋值的时候是这个样子的 Person person=new Person(); person.setAge(13); person.setId("33"); person.setName("薛之谦"); 这个是我

java设计模式-桥接模式(屌丝男学设计模式)

本文介绍设计模式中的桥接(Bridge)模式的概念,用法,以及实际应用中怎么样使用桥接模式进行开发. Bridge模式的概念 Bridge 模式是构造型的设计模式之一.Bridge模式基于类的最小设计原则,通过使用封装,聚合以及继承等行为来让不同的类承担不同的责任.它的主要特点是把抽象(abstraction)与行为实现(implementation)分离开来,从而可以保持各部分的独立性以及应对它们的功能扩展. Bridge模式的应用场景 面向对象的程序设计(OOP)里有类继承(子类继承父类)的

Java设计模式--备忘录模式

备忘录模式(别名:标记) 在不破坏封装性的前提下,捕捉一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. Memento Pattern(Another Name: Token) Without violating encapsulation, capture and externalize an object original state so that the object can be restored to this state later. 类图

Java设计模式--模板方法模式

模板方法模式 定义一个操作中算法的骨架,而将一些步骤延迟到子类中.模板方法使子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤. Template Method Pattern Define the skeleton of an algorithm in an operation, deferring some steps to subclasses. Template Method lets subclasses redefine certain steps of an algorit