DesignPattern: Composite Pattern

Composite Design Pattern

1) Motivation:

        There are many times when a program need to manipulate a tree data structure and it is necessary to treat both Branches as well as Leaf Nodes uniformly.

        Consider for example a program that manipulates a file system. A file system is a tree structure that contains Branches which are folders as well as Leaf Nodes which are files.

        Note that a folder object ususally contains one or more files or folder objects and thus is a complex object where a file is a simple object.

        Note also that since files and folders had many operations and attributes in common, such as moving or copying a file or a folder, listing file or folder attributes such as file name and size.

        It would be easier and more convenient to treat both file and folder objects uniformly by defining a File System Resource Interface.

 

2) Intent:

        The intent of this pattern is to compose objects into tree structures to represent part-whole hierarchies.

        Composite lets client treat individual objects and compositions objects uniformly.

 

3) Implementation:


    1> Component:

         Component is the abstraction of leafs and composites. It defines the interface that must be implemented by the object in the composition.

         For example, a file resource system defines move, copy, reName and getSize methods for files and folders.

    2> Leaf:

         Leafs are objects that have no children. They implement services described by the Component interface.

         For example, a file object implements move, copy, reName as well as getSize methods which are related to the component interface.

    3> Composite:

         A composite stores child components in addition to implementing methods defined by the Component interface.

         Composites implements methods defined in the Component interface by delegating to child components.

         In addition, composites provide additional methods for adding, removing as well as getting components.

    4> Client:

         The Cilent manipulate objects in the hierarchy using the Component interface.

         A Client has a reference to a tree data structure and needs to perform operations on all nodes independent of the fact that a node might be a brach or a leaf.

        The Client simply obtains a reference to the required node using the Component interface, and deals with the node using the interface.

         It doesn't matter if the node is a Leaf or a Composite.

 

4) Applicablity & Examples:

    The composite pattern applies when there is a part-whole hierarchy of objects and a client needs to deal with object uniformly regardless of the fact that an object might be a leaf or a branch.

    Example: Graphics Drawing Editor

        In graphics editors a shape can be basic or complex.

       An example of a simple shape is a Line, where a complex shape is a rectangle which is made of four Line objects. 

       Since shapes have many operations in common such as rendering the shape to screen,

       and since shapes follow a part-whole hierarchy, composite pattern can be used to enable the program to deal with all shapes uniformly.



package edu.xmu.oop.composite;

public interface Shape {
    public void render();
}
package edu.xmu.oop.composite;

public class LineShape implements Shape {
    public void render() {
	System.out.println("Render [LineShape]");
    }
}
package edu.xmu.oop.composite;

public class RectangleShape implements Shape {
    public void render() {
	System.out.println("Render [RectangleShape]");
    }
}
package edu.xmu.oop.composite;

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

public class ComplexShape implements Shape {
    private List<Shape> components = new ArrayList<Shape>();

    public void render() {
	System.out.println("Start render [ComplexShape]");
	for (Shape shape : components) {
	    shape.render();
	}
	System.out.println("Finished render [ComplexShape]");
    }

    public void addComponent(Shape shape) {
	components.add(shape);
    }

    public void removeComponent(Shape shape) {
	components.remove(shape);
    }
}
package edu.xmu.oop.composite;

public class GraphicsEditor {
    public void display(Shape shape) {
	shape.render();
    }
}
package edu.xmu.oop.composite;

import org.junit.Before;
import org.junit.Test;

public class GraphicsEditorTest {
    private GraphicsEditor graphicsEditor;
    private Shape complexShape1;

    @Before
    public void setUp() {
	graphicsEditor = new GraphicsEditor();
	complexShape1 = new ComplexShape();
	((ComplexShape) complexShape1).addComponent(new LineShape()); // We have to cast complexShape1 to ComplexShape
	((ComplexShape) complexShape1).addComponent(new RectangleShape());// We have to cast complexShape1 to ComplexShape

	Shape complexShape2 = new ComplexShape();
	((ComplexShape) complexShape2).addComponent(new LineShape());// We have to cast complexShape2 to ComplexShape
	((ComplexShape) complexShape2).addComponent(new LineShape());// We have to cast complexShape2 to ComplexShape
	((ComplexShape) complexShape2).addComponent(new RectangleShape());// We have to cast complexShape2 to ComplexShape
	((ComplexShape) complexShape1).addComponent(complexShape2);// We have to cast complexShape1 to ComplexShape
    }

    @Test
    public void displayTest() {
	graphicsEditor.display(complexShape1);
    }
}

    And we can see in the diagram below that the objects are organized as a tree.




5) Alternative Implementations:

        Note that in previous example, there were times when we have to avoid dealing with composite objects through the Shape interface, 

        And we have specifically dealt with them as composites(when using the method addComponent()).

        To avoid such situations and to further increase uniformity, one can add method to add, remove and get child components to the Shape interface. 

 

6) Related Patterns:

    1> Decorator Pattern:

         Decorator is often used with Composite.

         When Decorator and Composite are used together, they will usually have a common parent class, 

         So Decorator will have to support the Component interface with operations like Add, Remove and GetChild.

 

Reference Links:

1) http://www.oodesign.com/composite-pattern.html

2) http://en.wikipedia.org/wiki/Composite_pattern

 

标题基于SpringBoot的在线网络学习平台研究AI更换标题第1章引言介绍基于SpringBoot的在线网络学习平台的研究背景、意义、国内外现状、论文研究方法及创新点。1.1研究背景与意义阐述在线网络学习平台的重要性及其在教育领域的应用价值。1.2国内外研究现状分析当前国内外在线网络学习平台的发展状况及趋势。1.3研究方法与创新点说明本研究采用的方法论和在研究过程中的创新之处。第2章相关理论技术概述SpringBoot框架、在线教育理论及相关技术基础。2.1SpringBoot框架概述介绍SpringBoot框架的特点、优势及其在Web应用中的作用。2.2在线教育理论阐述在线教育的基本理念、教学模式及其与传统教育的区别。2.3相关技术基础介绍开发在线网络学习平台所需的关键技术,如前端技术、数据库技术等。第3章在线网络学习平台设计详细描述基于SpringBoot的在线网络学习平台的整体设计方案。3.1平台架构设计给出平台的整体架构图,并解释各个模块的功能及相互关系。3.2功能模块设计详细介绍平台的主要功能模块,如课程管理、用户管理、在线考试等。3.3数据库设计说明平台的数据库设计方案,包括数据表结构、数据关系等。第4章平台实现与测试阐述平台的实现过程及测试方法。4.1平台实现详细介绍平台的开发环境、开发工具及实现步骤。4.2功能测试对平台的主要功能进行测试,确保功能正常且符合预期要求。4.3性能测试对平台的性能进行测试,包括响应时间、并发用户数等指标。第5章平台应用与分析分析平台在实际应用中的效果及存在的问题,并提出改进建议。5.1平台应用效果介绍平台在实际教学中的应用情况,包括用户反馈、使用情况等。5.2存在问题及原因分析分析平台在运行过程中出现的问题及其原因,如技术瓶颈、用户体验等。5.3改进建议与措施针对存在的问题提出具体的改进建议和措施,以提高平台的性能和用户满意度
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值