`
wenrunchang123
  • 浏览: 250987 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

 
阅读更多

 组合模式:

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

 

 

用最经典的树和叶子节点的关系来描述整体-部分 关系最为恰当不过了:

      在数据结构中,树有孩子节点,这个孩子节点可能是树,也可能是叶子节点。叶子节点不能再有孩子节点,但树可以有。从这里可以看出,树和叶子节点都可以被看成是 孩子节点。组合模式的目的是将整体和部分被一致对待,那么在这里,我们可以将叶子节点和树合并成一个组合。既然合并了,那么提供给客户代码的接口肯定是相同的。

 

1. Component 类,组合中的对象声明接口,在适当的情况下,声明所有类共有接口的默认行为。在这里,Component 类树枝和叶子的共有抽象类,也就是它定义了共有的方法,这些方法由子类去实现。

 

 

public abstract class Component {
	
	protected String name;
	
	public Component(String name){
		this.name = name;
	}
	
	public abstract void add(Component component);    //为树枝节点还有子节点
	public abstract void remove(Component component); //为树枝节点移除某个子节点
	public abstract void showComponent(int dept);   //显示该节点的树形结构
}

 

2. Composite  类,组合类。不过在这里主要行使的是树枝节点的功能。同时也体现了树枝 - 叶子  是  整体- 部分 关系。

    既然既是组合类又是树枝类,那么必须会有管理子节点的功能,以及递归显示还是节点的功能。

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


public class Composite extends Component{
	
	private List<Component> children = new ArrayList<Component>();
	private String showDept = "";

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

	@Override
	public void add(Component component) {
		children.add(component);
	}

	@Override
	public void remove(Component component) {
		children.remove(component);
	}

	@Override
	public void showComponent(int dept) {
		for(int i=0;i<dept;i++){
			showDept += "--";
		}
		System.out.println(showDept+name);
		for(Component component : children){
			component.showComponent(dept + 1);
		}
	}
}

 

3. Leaf 类,叶子节点类。叶子节点没有子节点,其虽然继承 了Component 类,并重写了Component所有的方法,但只在自己需要的方法中添加有效代码:

public class Leaf extends Component{

	String showDept ="";
	public Leaf(String name) {
		super(name);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void add(Component component) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void remove(Component component) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void showComponent(int dept) {
		// TODO Auto-generated method stub
		for(int i=0;i<dept;i++){
			showDept += "--";
		}	
		System.out.println(showDept+name);
	}
}

 

4. 编写测试代码,来验证我对组合模式理解的正确性

public class TestCompositePattern {
	public static void main(String[] args){
		
		Composite root = new Composite("树根");
		
		Composite branch1 = new Composite("树枝一");
		Composite branch2 = new Composite("树枝二");		
		Composite branch21 = new Composite("树枝二子树枝一");
		
		branch1.add(new Leaf("树枝一叶子一"));
		branch1.add(new Leaf("树枝一叶子二"));
		branch1.add(new Leaf("树枝一叶子三"));
		branch21.add(new Leaf("树枝二子树枝一叶子一"));		
		branch2.add(branch21);
			
		root.add(branch1);
		root.add(branch2);
		root.showComponent(1);				
	}
}

 

结果输出:

--树根
----树枝一
------树枝一叶子一
------树枝一叶子二
------树枝一叶子三
----树枝二
------树枝二子树枝一
--------树枝二子树枝一叶子一

 

5.总结:

组合模式分为安全方式和透明方式;

透明方式:叶子节点和 树枝节点都具有相同的接口,在这里,Leaf 类也实现了add,remove 方法

      好处:都提供给客户代码一样的接口

      坏处:Leaf 类重写了不需要的方法,并且这写方法没有意义,并且可能会误导客户代码来调用这些无意义的方法。

 

安全方式:在Component 只声明公共都需要的接口,在本例中,Component 应该值声明showComponent() 方法,而将add,remove() 方法的声明和实现都应该放在Composite 类中。

      好处:Leaf 没有无效代码

      坏处:客户代码在调用树枝或叶子及节点的接口时,例如调用add 方法,得先判断是不是 Composite 类。

 

分享到:
评论

相关推荐

    c++设计模式-结构型模式-组合模式

    c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...

    java常用设计模式-组合模式

    组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...

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

    组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...

    设计模式-组合实体

    在众多设计模式中,组合实体(Composite)模式是一种结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得用户可以一致地处理单个对象和对象组合。在iOS开发中,组合实体模式尤其有用,因为它简化了复杂...

    设计模式--组合模式java例子

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...

    设计模式-组合模式(讲解及其实现代码)

    组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在组合模式中,单个对象和组合对象都被视为同一类型,这使得客户端代码可以对...

    java设计模式---诙谐易懂版

    代理模式(Proxy Pattern)、单例模式(Singleton Pattern)、工厂方法模式...组合模式(Composite Pattern)、观察者模式(Observer Pattern)、责任链模式(Chain of Responsibility Pattern)、访问者模式(Visitor ...

    设计模式精解-GoF-23种设计模式解析--附C++源代码

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责。 - 享元模式(Flyweight):使用共享对象,有效地支持大量细...

    JAVA设计模式-chm版

    包括适配器模式(Adapter)、桥接模式(Bridge)、装饰器模式(Decorator)、外观模式(Facade)、组合模式(Composite)、享元模式(Flyweight)和代理模式(Proxy)。这些模式可以帮助我们更好地组织代码,实现...

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

    一、概述 在Java中,组合模式用于将对象组合成树结构,以表示...在软件工程中,组合模式是一种分区设计模式。组合模式描述了一组对象应被视为单个对象的实例来处理。组合的意图是将对象“组合”成树结构,以表示部分

    设计模式-王翔 全本

    例如,装饰器模式可以和组合模式(Composite)结合,用于动态地增加或减少对象的功能。同时,王翔可能会讨论如何在实际项目中选择和应用设计模式,以及避免陷入过度设计的陷阱。 在阅读《设计模式》.pdf的过程中,...

    26种设计模式-----pdf

    结构型模式则关注如何将类或对象组合成更大的结构,例如适配器模式(Adapter)、装饰器模式(Decorator)、代理模式(Proxy)、桥接模式(Bridge)和组合模式(Composite)。这些模式可以帮助我们处理类与类之间的...

    设计模式实验报告-组合模式.docx

    组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体层次结构。该模式使得用户对单个对象和组合对象的使用具有一致性。 #### 实验内容 实验内容主要包括设计和实现...

    C#设计模式-C#设计模式

    7. 组合模式(Composite): 组合模式将对象组合成树形结构以表示“部分-整体”的层次结构。C#中的组合模式允许用户对单个对象和组合对象进行一致的操作,提供了一种统一的接口。 8. 装饰器模式(Decorator): ...

    组合模式-------树形模式

    组合模式,也称为树形模式,是一种结构型设计模式,它允许我们表示部分-整体层次结构,使得客户端代码可以统一地处理单个对象和对象集合。这种模式将对象组织成树形结构,允许用户对部分或整个树进行操作,简化了...

    23种 设计模式---面向对象的基本原则

    - 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构,使得用户对单个对象和组合对象的使用具有一致性。 - 装饰模式(Decorator):动态地给一个对象添加一些额外的职责,提供比继承更...

    c++-设计模式之组合模式(Composite Pattern)

    组合模式(Composite Pattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以以统一的方式对待单个对象和组合对象,这种模式常用于需要处理树形结构的数据...

    设计模式-可复用面向对象软件的基础

    2. 结构型模式:关注如何将类或对象组合成更大的结构,例如适配器模式(Adapter)、桥接模式(Bridge)、组合模式(Composite)、装饰模式(Decorator)、外观模式(Facade)、享元模式(Flyweight)和代理模式...

Global site tag (gtag.js) - Google Analytics