`

Java设计设计模式之组合模式(Composition)

阅读更多

那王麻子自从做了肉夹馍生意后,真是风生水起,分店开的跟下饺子似的,没多久这分店经营就开遍全国了,一时半会儿连自己都数不过来开了哪些分店了,为了方便管理他在各个地区都设立了分公司。于是这期我们分享设计模式里的组合模式。

 

组合模式在处理复杂的树形结构操作中有他的独到的地方,对于树形结构层次简单,叶子有限的数据结构处理过程中,如果使用组合模式就有些卖艺之嫌。他的优点是简单有效、运算方式清晰明了。缺点是由于领域模型与业务处理紧紧耦合到一块,是典型的充血模型,代码的可维护性、可读性不强。因此,一般设计过程中,对组合模式的选择都是慎之又慎,谨慎采纳。

 

但是也不尽然,比如一些大部分的非业务型处理逻辑如磁盘扫描之类的功能,如果用其他的方式来实现,代码量会大幅增加,用组合模式会让人感觉代码简洁,结构清晰。

 

用类图来说明组合模式如下:

 

示例代码如下:

 

/**
 * 
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: Department.java, v 0.1 2017年3月11日 下午4:38:56 Administrator Exp $
 */
public abstract class Department {

    /**  */
    private String name;

    /**
     * default constructor
     */
    public Department(String name) {
        this.name = name;
    }

    /**
     * default constructor 
     */
    public Department() {
    }

    /**
     * 添加
     */
    protected abstract void add(Department department);

    /**
     * 打印
     */
    protected abstract void show(int depth);

    /**
     * Getter method for property <tt>name</tt>.
     * 
     * @return property value of name
     */
    public String getName() {
        return name;
    }

    /**
     * Setter method for property <tt>name</tt>.
     * 
     * @param name value to be assigned to property name
     */
    public void setName(String name) {
        this.name = name;
    }

}

 

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

import java.util.ArrayList;
import java.util.List;

/**
 * 
 * @author Administrator
 * @version $Id: DinnerDepartment.java, v 0.1 2017年3月11日 下午4:45:50 Administrator Exp $
 */
public class DinnerDepartment extends Department {

    /**  */
    private List<Department> deptList = new ArrayList<Department>();

    public DinnerDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {

        deptList.add(department);

    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("-");
        }
        System.out.println(new String(sb) + this.getName());
        for (Department c : deptList) {
            c.show(depth + 2);
        }
    }

}

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: HRDepartment.java, v 0.1 2017年3月11日 下午5:01:10 Administrator Exp $
 */
public class HRDepartment extends Department {
    public HRDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {
    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(new String(sb) + this.getName());
    }

}

 

 

 

/**
 * Copyright (c) 2004-2017 All Rights Reserved.
 */
package composite;

/**
 * 
 * @author Administrator
 * @version $Id: FinanceDepartment.java, v 0.1 2017年3月11日 下午5:02:42 Administrator Exp $
 */
public class FinanceDepartment extends Department {
    public FinanceDepartment() {
    }

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

    /** 
     * @see composite.Department#add(composite.Department)
     */
    @Override
    protected void add(Department department) {
    }

    /** 
     * @see composite.Department#show(int)
     */
    @Override
    protected void show(int depth) {
        StringBuilder sb = new StringBuilder("");
        for (int i = 0; i < depth; i++) {
            sb.append("--");
        }
        System.out.println(new String(sb) + this.getName());
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub  
        Department root = new DinnerDepartment();
        root.setName("北京总公司");
        root.add(new HRDepartment("总公司人力资源部"));
        root.add(new FinanceDepartment("总公司财务部"));

        Department shandongCom = new DinnerDepartment("山东分公司");
        shandongCom.add(new HRDepartment("山东分公司人力资源部"));
        shandongCom.add(new FinanceDepartment("山东分公司账务部"));

        Department zaozhuangCom = new DinnerDepartment("枣庄办事处");
        zaozhuangCom.add(new FinanceDepartment("枣庄办事处财务部"));
        zaozhuangCom.add(new HRDepartment("枣庄办事处人力资源部"));

        Department jinanCom = new DinnerDepartment("济南办事处");
        jinanCom.add(new FinanceDepartment("济南办事处财务部"));
        jinanCom.add(new HRDepartment("济南办事处人力资源部"));

        shandongCom.add(jinanCom);
        shandongCom.add(zaozhuangCom);

        Department huadongCom = new DinnerDepartment("上海华东分公司");
        huadongCom.add(new HRDepartment("上海华东分公司人力资源部"));
        huadongCom.add(new FinanceDepartment("上海华东分公司账务部"));

        Department hangzhouCom = new DinnerDepartment("杭州办事处");
        hangzhouCom.add(new FinanceDepartment("杭州办事处财务部"));
        hangzhouCom.add(new HRDepartment("杭州办事处人力资源部"));

        Department nanjingCom = new DinnerDepartment("南京办事处");
        nanjingCom.add(new FinanceDepartment("南京办事处财务部"));
        nanjingCom.add(new HRDepartment("南京办事处人力资源部"));

        huadongCom.add(hangzhouCom);
        huadongCom.add(nanjingCom);

        root.add(shandongCom);
        root.add(huadongCom);

        root.show(12);
    }

}

 

 运行结果如下:

------------北京总公司
----------------------------总公司人力资源部
----------------------------总公司财务部
--------------山东分公司
--------------------------------山东分公司人力资源部
--------------------------------山东分公司账务部
----------------济南办事处
------------------------------------济南办事处财务部
------------------------------------济南办事处人力资源部
----------------枣庄办事处
------------------------------------枣庄办事处财务部
------------------------------------枣庄办事处人力资源部
--------------上海华东分公司
--------------------------------上海华东分公司人力资源部
--------------------------------上海华东分公司账务部
----------------杭州办事处
------------------------------------杭州办事处财务部
------------------------------------杭州办事处人力资源部
----------------南京办事处
------------------------------------南京办事处财务部
------------------------------------南京办事处人力资源部

 

 

各位看官,原创不易啊,转载请注明出处: http://danlley.iteye.com 看在打字不易的份上,打赏一个吧

参考文献:

http://baike.baidu.com/link?url=Ya5mjVEkWCIknSlkYJX-FvXlPDNJmsB16m4-d1eXhOM5kMn0phNQ8xY_326Y5BgrDWj5MYW5lxnCvL_xZ-5kAP6P_ArKyMKKvVPNWorNvGmVpAxoXib9lpWyJlCqKhO7
http://blog.csdn.net/hfmbook/article/details/7693069
  • 大小: 17.4 KB
分享到:
评论

相关推荐

    【Java 设计模式-源码】组合器模式:构建灵活的代码组合

    在 Java 中,组合器模式是一种功能强大的设计模式,它允许开发者通过组合简单的、可重用的函数来创建更复杂的行为。本文将详细介绍组合器模式的意图、解释、编程示例、适用场景、实际应用、优点和权衡。同时,还将...

    java开发中使用的设计模式

    ### Java开发中使用的设计模式详解 #### 设计模式概述 设计模式是在软件设计过程中解决常见问题的一套可重复使用的解决方案。这些模式可以帮助开发者编写出更易于理解、维护和扩展的代码。本文主要针对依赖与关联、...

    二十三种设计模式【PDF版】

    设计模式之 Template(模板方法) 实际上向你介绍了为什么要使用 Java 抽象类,该模式原理简单,使用很普遍. 设计模式之 Strategy(策略) 不同算法各自封装,用户端可随意挑选需要的算法. 设计模式之 Chain of ...

    23种设计模式,及设计模式的七种设计原则的文档和Java代码实现

    在Java编程中,设计模式的应用极大地提高了代码的可维护性、可扩展性和可复用性。这个压缩包包含了23种经典的设计模式,以及一个额外的规格模式(SpecificationPattern),并且每种模式都有详细的文档说明和Java代码...

    JAVA经典设计模式大全

    2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5...

    设计模式文档

    2.2.3 组合模式 27 2.3 格式化 27 2.3.1 封装格式化算法 27 2.3.2 Compositor和Composition 27 2.3.3 策略模式 29 2.4 修饰用户界面 29 2.4.1 透明围栏 29 2.4.2 Monoglyph 30 2.4.3 Decorator 模式 32 2.5 支持多种...

    软件设计模式(JAVA)习题答案.doc

    2. 结构型设计模式:如适配器模式、装饰器模式、代理模式、组合模式、桥接模式等,关注对象的组合和结构。 3. 行为型设计模式:如观察者模式、策略模式、模板方法模式、访问者模式等,关注对象间的交互和职责分配。 ...

    java组合的算法

    在Java编程中,组合(Composition)是一种设计模式,它允许我们把对象组织成树状层次结构,这样子对象可以被视为单个单元。这种模式强调"部分-整体"的关系,是面向对象设计的基本原则之一。本篇文章将深入探讨Java中...

    设计模式小结

    本文旨在总结几种核心的设计模式,包括依赖、关联、聚合、组合、继承、实现等基本对象间关系,以及创建型模式中的简单工厂模式和工厂方法模式。 #### 对象间关系 1. **依赖(Dependence)** 当一个类A依赖于另一...

    DP设计模式PPT_NEW

    合成/聚合复用原则(Composition/Aggregation Reuse Principle, CARP)推荐优先使用组合或聚合,而不是继承,以减少耦合度并提高代码的灵活性。 迪米特法则(Law of Demeter, LoD)又称最少知识原则,提倡一个对象...

    C++(设计模式)1.0.pdf

    设计模式不是特定于某一种编程语言的,它们适用于面向对象编程语言,如Java、C#、C++、Python等。由于本笔记主要以C++实现,因此特别强调了在C++中的应用。 3. 什么是类和对象? 类是面向对象编程的基础,它是具有...

    软件体系结构与设计模式课堂笔记.docx

    结构型模式如适配器模式(Adapter)、组合模式(Composite)、装饰器模式(Decorator)关注类的组合和结构。行为型模式如命令模式(Command)、观察者模式(Observer)关注对象的行为和通信。这些模式为解决特定问题...

    JAVA程序员该懂的设计原则

    例如,工厂模式和单例模式是Java中常见的设计模式,它们都是基于上述原则的实例。《Effective Java》和《Head First Design Patterns》等书籍提供了深入的解释和实例,是学习这些原则的好资源。 在实践中,不断学习...

    Java-Composition-Assignment

    6. **代码复用和设计模式**:组合可以与工厂模式、策略模式等设计模式结合使用,以实现更复杂的软件结构。 通过这个作业,你将有机会实践这些理论知识,编写包含组合关系的Java类,并解决实际问题。这将帮助你更好...

    Java面向对象设计原则.docx

    OOPS设计模式的优点在于易于测试和维护封装的代码。如果你使用Java编码,可以默认私有化变量和方法,并逐步增加访问权限,比如从private到protected和not public。 原则3: 开闭原则 Open-Close Principle(OCP) 即...

    Java期末复习1

    在Java中,常见的设计模式包括: - **单例模式**:确保一个类只有一个实例,并提供全局访问点。 - **观察者模式**:定义对象间的一对多依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知并被...

    详解java中面向对象设计模式类与类的关系

    Java面向对象设计模式类与类的关系详解 Java面向对象设计模式中,类与类之间的关系是非常重要的。类之间的关系可以分为六种:依赖、关联、聚合、组合、继承和实现。每种关系都有其特点和应用场景。 1. 依赖...

    一套英文Java笔试题面试题.doc

    1. JVM(Java Virtual Machine)是Java运行时环境的核心组件,它负责解析并执行字节码,提供了...以上内容涵盖了Java基础、JVM、Web应用开发、EJB、UML关系、设计模式、框架以及SQL等多个Java笔试和面试的常见知识点。

    java面向对象设计原则(带书签高清晰pdf)

    #### 二、面向对象设计原则之FCOI详解 ##### 1. 对象组合(Composition) **定义:** 对象组合是一种通过将其他对象嵌入到一个对象中来实现复用的方法。这种复用机制使得对象能够通过委托给其所包含的对象来获得新...

Global site tag (gtag.js) - Google Analytics