`

设计模式的理解--组合模式

    博客分类:
  • OOD
 
阅读更多

组合模式:

允许你将对象组合成树形结构来表现“整体/部分”层次结构,组合能让客户以一致的方式来处理个别对象以及组合对象。

 

 



 示例:

定义树形节点:

/**
 * 树节点,具有添加移除子节点,遍历所有节点的能力
 * @author yanlei
 *
 */
public interface TreeNode {
	
	public void addTreeNode(TreeNode treeNode) ;
	public void removeTreeNode(TreeNode treeNode); 
	public boolean isLeaf();
	/**
	*内部遍历:forEach方法会调用子节点的forEach方法,每一个forEach方法内部都调用TreeNodeIterable.iterate,并向
 * 			   TreeNodeIterable.pushParent保存当前父节点,通过TreeNodeIterable.iterate的
 * 			      返回值确定是否继续遍历,可以知道当前节点的父节点链。
 * 
	*/
	public boolean forEach(TreeNodeIterable treeComponentOperator);
	
}

 具体实现:

/**
 * 树节点的实现
 * @author yanlei
 *
 */
public class TreeNodeImpl implements TreeNode{
	Collection<TreeNode> childs = null;
	private Collection<TreeNode> getChilds(){
		if(childs == null){
			childs = new LinkedList();
		}
		return childs;
	}
	private boolean haveNoChild(){
		return childs ==null || childs.isEmpty();
	}
	@Override
	public boolean isLeaf() {
		// TODO Auto-generated method stub
		return haveNoChild();
	}
	public void setCollection(Collection<TreeNode> collection) {
		this.childs = collection;
	}

	@Override
	public boolean forEach(TreeNodeIterable treeNodeIterable) {
		// TODO Auto-generated method stub
		
		if(treeNodeIterable.iterate(this) ){
			boolean flag = true;
			if(!this.isLeaf()){
				treeNodeIterable.pushParent(this);
				Iterator<TreeNode> iterator = this.childs.iterator();
				while(iterator.hasNext()){
					flag = iterator.next().forEach(treeNodeIterable);
					if(!flag){
						 break;
					}
				}
				treeNodeIterable.popParent();
			}
			return flag;
		}else{
			return false;
		}
	}

	@Override
	public void addTreeNode(TreeNode treeComponet)
			throws UnsupportedOperationException {
		// TODO Auto-generated method stubT
		this.getChilds().add(treeComponet);
	}

	@Override
	public void removeTreeNode(TreeNode treeComponet)
			throws UnsupportedOperationException {
		// TODO Auto-generated method stub
		this.getChilds().remove(treeComponet);
	}
}
 
/**
 * 树节点遍历时,对每个节点的处理类
 * @author yanlei
 *
 */
public interface TreeNodeIterable<T extends TreeNode> {
	/**
	 * 保存当前父节点
	 * @param treeComponent
	 */
	public void pushParent(T treeNode);
	/**
	 * 移除当前父节点
	 * @return
	 */
	public void popParent();
	/**
	 * 对当前节点操作
	 * @param treeComponent
	 * @return
	 */
	public boolean iterate(T treeNode);
}
 

测试类:
import java.util.ArrayList;
import java.util.List;

import org.springframework.util.StringUtils;

/**
 * 菜单
 * @author yanlei
 */
public class Menu extends TreeNodeImpl{
	
	
	public Menu(String name, int id) {
		super();
		this.name = name;
		this.id = id;
	}

	String name;
	int id;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	
	public static void main(String[] args){
		Menu mainMenu = new Menu("主菜单",1);
		Menu sysMenu = new Menu("系统管理",2);
		sysMenu.addTreeNode(new Menu("用户管理",3));
		sysMenu.addTreeNode(new Menu("权限管理",4));
		sysMenu.addTreeNode(new Menu("审批流程管理",5));
		mainMenu.addTreeNode(sysMenu);
		Menu reportMenu = new Menu("报表展示",6);
		Menu subMenu1 = new Menu("用户统计报表",7);
		subMenu1.addTreeNode(new Menu("用户点击率统计",8));
		reportMenu.addTreeNode(subMenu1);
		reportMenu.addTreeNode(new Menu("业务办理情况月表",8));
		mainMenu.addTreeNode(reportMenu);
		//打印出菜单项(不含菜单目录)的全路径
		mainMenu.forEach(new TreeNodeIterable<Menu>(){
			List list = new ArrayList();
			@Override
			public void pushParent(Menu menu) {
				// TODO Auto-generated method stub
				list.add(menu.getName());
			}

			@Override
			public void popParent() {
				// TODO Auto-generated method stub
				 list.remove(list.size()-1);
			}

			@Override
			public boolean iterate(Menu menu) {
				// TODO Auto-generated method stub
				if(menu.isLeaf()){
					System.out.println(StringUtils.arrayToDelimitedString(list.toArray(), "-")+"-"+menu.getName());
					/**
					输出:
					主菜单-系统管理-用户管理
					主菜单-系统管理-权限管理
					主菜单-系统管理-审批流程管理
					主菜单-报表展示-用户统计报表-用户点击率统计
					主菜单-报表展示-业务办理情况月表
					**/
				}
				return true;
			}
			
		});
	}
}
 
  • 大小: 77.7 KB
分享到:
评论

相关推荐

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

    C++源代码文件可以帮助你更好地理解如何在实际项目中应用这些模式,通过阅读和分析代码,你可以学习如何在C++中实现这些设计模式,并将它们融入到自己的编程实践中。 总而言之,设计模式是软件开发中的宝贵财富,...

    C++设计模式--基于Qt4开源跨平台开发框架

    通过学习《C++设计模式--基于Qt4开源跨平台开发框架》,开发者不仅可以掌握设计模式的本质和应用场景,还能深入理解Qt4框架的强大功能。结合两者,能够提高代码质量,降低维护成本,同时实现高效且可靠的跨平台应用...

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

    ### 设计模式精解——GoF 23种设计模式解析及C++实现源码 #### 引言 设计模式是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。GoF(Gang of Four)所提出的23种设计模式,被认为是面向对象...

    设计模式课件大全

    设计模式06-适配器、桥接、组合模式 设计模式07-组合模式、装饰模式 设计模式09-外观模式、享元模式 设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式...

    设计模式精解-GoF 23种设计模式解析附C++.pdf

    通过深入理解这些设计模式,我们可以更好地进行面向对象的分析与设计(OOA/D),提高代码的质量和系统的可维护性。 #### 0.1 设计模式解析(总序) 设计模式不仅仅是一系列具体的解决方案,更是一种思维方式。它们...

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

    使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。设计模式一般分为三大类:创建型模式、结构型模式和行为型模式。 3. 根据文件内容,诸葛亮给赵云的三个锦囊妙计可以用策略模式来实现。每...

    设计模式精解-GoF 23种设计模式解析附C++实现源码.pdf

    本文旨在深入解析这些设计模式,并通过C++实现来帮助读者更好地理解和应用这些模式。 #### 1. 创建型模式 创建型模式关注的是对象的创建机制,它们使得系统能够独立于如何创建、组合这些对象。 - **1.1 Factory...

    设计模式精解-GoF23种设计模式解析附C++实现源码

    C++实现源码提供了具体编程环境下的应用实例,帮助读者更好地理解和应用这些设计模式。通过阅读和实践这些源码,开发者可以更深入地掌握如何在实际项目中灵活运用设计模式,提升代码质量和可维护性。

    Java设计模式----通俗易懂版

    这个资源"Java设计模式----通俗易懂版"显然是一个专门针对初学者或需要深入理解设计模式的开发者编写的指南。作者以形象生动的例子解释了23种经典的Java设计模式,使得复杂的概念变得更加易于理解。 首先,我们要...

    设计模式精解-GoF 23种设计模式解析附C++实现源码 完整版

    通过阅读《设计模式精解》并参考其中的C++实现源码,开发者能够更好地理解和应用这些模式,以构建更高效、可维护和可扩展的软件系统。在实际开发中,结合使用多种设计模式可以创造出灵活、可复用且易于理解的代码。

    设计模式精解-GoF 23种设计模式

    设计模式是软件工程中的一种重要思想,它是在特定情境下,为解决常见问题而提出的...通过阅读《设计模式精解-GoF 23种设计模式解析.pdf》,你可以深入理解每种模式的意图、结构、实现和适用场景,提升你的编程水平。

    新版设计模式手册 - C#设计模式(第二版)

    《新版设计模式手册 - C#设计模式(第二版)》是一部深入探讨C#编程中设计模式的权威指南,尤其适合已经有一定C#基础并希望提升软件设计能力的开发者阅读。设计模式是解决软件开发中常见问题的经验总结,是软件工程的...

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

    - **4.1 在开发中体验设计模式**:通过具体例子展示了如何在实际项目中应用设计模式,帮助开发者更好地理解和掌握这些模式的实际用途。 - **4.2 深入理解State模式**:详细介绍了State模式的应用场景、原理和实现...

    软件设计模式--填空题+简答题(复习7).rar

    2. **设计模式分类**:设计模式通常分为三类:创建型模式(如工厂方法、抽象工厂、单例、建造者、原型)、结构型模式(如适配器、桥接、装饰、组合、代理、外观、享元)和行为型模式(如责任链、命令、解释器、迭代...

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

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

Global site tag (gtag.js) - Google Analytics