一、模式解析

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

组合模式的要点是:

  1、对象整体以树形层次结构进行展示

  2、树的根节点和子节点均可以添加删除子节点,叶子节点无子节点

  3、可以通过节点的行为动作调用并展示他所有自己点的行为

  4、为了方便的实现无限节点的扩展,我们通常定义一个公共的接口,所有子节点和叶子节点均实现此接口

二、模式代码

1、公共接口,供所有子节点和叶子节点实现

  1. package component.patten;
  2.  
  3. public abstract class Component {
  4. protected String name;
  5. public Component(String name){
  6. this.name=name;
  7. }
  8. public abstract void add(Component component);
  9. public abstract void remove(Component component);
  10. public abstract void display(int deepth);
  11.  
  12. }

2、叶子节点

  1. package component.patten;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public class Composite extends Component {
  7. public Composite(String name) {
  8. super(name);
  9. }
  10.  
  11. List<Component> list=new ArrayList<Component>();
  12.  
  13. @Override
  14. public void add(Component component) {
  15. list.add(component);
  16. }
  17.  
  18. @Override
  19. public void remove(Component component) {
  20. list.remove(component);
  21. }
  22.  
  23. @Override
  24. public void display(int deepth) {
  25. System.out.println(this.name);
  26. //叶子节点的方法可以调用展示所有他的子节点的方法
  27. for(Component component:list){
  28. StringBuffer buffer=new StringBuffer();
  29. for (int i = 0; i < deepth; i++) {
  30. buffer.append("--");
  31. }
  32. System.out.print(buffer);
  33. component.display(deepth+1);
  34. }
  35. }
  36.  
  37. }

3、叶子节点,叶子节点并不实现增加和删除方法,但是因为集成了接口,所以必须有

  1. package component.patten;
  2.  
  3. public class Leaf extends Component {
  4.  
  5. public Leaf(String name) {
  6. super(name);
  7. }
  8.  
  9. @Override
  10. public void add(Component component) {
  11. // TODO Auto-generated method stub
  12. }
  13.  
  14. @Override
  15. public void remove(Component component) {
  16. // TODO Auto-generated method stub
  17.  
  18. }
  19.  
  20. @Override
  21. public void display(int deepth) {
  22. System.out.println("--"+this.name);
  23. }
  24.  
  25. }

4、客户端代码

  1. package component.patten;
  2.  
  3. public class Client {
  4. public static void main(String[] args) {
  5. Component root=new Composite("root");
  6. Component com1=new Composite("com1");
  7. root.add(com1);
  8. Component leaf1=new Leaf("leaf1");
  9. Component leaf2=new Leaf("leaf2");
  10. Component leaf3=new Leaf("leaf3");
  11. com1.add(leaf1);
  12. com1.add(leaf2);
  13. com1.add(leaf3);
  14.  
  15. Component com2=new Composite("com2");
  16. root.add(com2);
  17. Component leaf4=new Leaf("leaf2");
  18. com2.add(leaf4);
  19.  
  20. root.display(1);
  21. }
  22. }

5、执行结果

  1. root
  2. --com1
  3. ------leaf1
  4. ------leaf2
  5. ------leaf3
  6. --com2
  7. ------leaf2

三、应用场景

  组合模式主要解决树形结构问题,比如集团与分子公司,电脑系统的文件夹和文件系统,系统中多级菜单,java集合框架中的List等方面进行使用,主要的要点就是对层级关系的添加和对子集信息的展示,以文件夹系统进行举例。

四、场景代码

1、定义文件的节点

  1. package component.example;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.List;
  5.  
  6. public abstract class Node {
  7. protected String name;
  8. protected List<Node> list=new ArrayList<Node>();
  9. public Node(String name){
  10. this.name=name;
  11. }
  12. public abstract void add(Node node) throws Exception;
  13. public abstract void remove(Node node) throws Exception;
  14. public abstract void display(String path);
  15. }

2、定义文件夹

  1. package component.example;
  2.  
  3. /**
  4. * 文件夹
  5. * @author zjl
  6. * @time 2016-2-2
  7. *
  8. */
  9. public class Folder extends Node {
  10.  
  11. public Folder(String name) {
  12. super(name);
  13. }
  14.  
  15. @Override
  16. public void add(Node node) {
  17. list.add(node);
  18. }
  19.  
  20. @Override
  21. public void remove(Node node) {
  22. list.remove(node);
  23. }
  24.  
  25. @Override
  26. public void display(String path) {
  27. path+="/"+this.name;
  28. for(Node node:list){
  29. node.display(path);
  30. }
  31. }
  32.  
  33. }

3、定义文件

  1. package component.example;
  2.  
  3. public class File extends Node {
  4.  
  5. public File(String name) {
  6. super(name);
  7. }
  8.  
  9. @Override
  10. public void add(Node node) throws Exception {
  11. throw new Exception("不支持此方法");
  12. }
  13.  
  14. @Override
  15. public void remove(Node node) throws Exception {
  16. throw new Exception("不支持此方法");
  17. }
  18.  
  19. @Override
  20. public void display(String path) {
  21. System.out.println(path+"/"+this.name);
  22. }
  23.  
  24. }

4、客户端

  1. package component.example;
  2.  
  3. public class Client {
  4. public static void main(String[] args){
  5. Folder document = new Folder("我的资料"); //我的资料文件夹
  6. File book = new File("Java编程思想.pdf"); //文档文件
  7. Folder music = new Folder("我的音乐"); //我的音乐文件夹
  8. File music1 = new File("你是我的眼.mp3"); //音乐文件1
  9. File music2 = new File("Without You.mp3"); //音乐文件2
  10. //确定树形结构关系
  11. document.add(book);
  12. document.add(music);
  13. music.add(music1);
  14. music.add(music2);
  15.  
  16. document.display("");
  17.  
  18. }
  19. }

5、运行结果

  1. /我的资料/Java编程思想.pdf
  2. /我的资料/我的音乐/你是我的眼.mp3
  3. /我的资料/我的音乐/Without You.mp3

[工作中的设计模式]组合模式compnent的更多相关文章

  1. [工作中的设计模式]原型模式prototype

    一.模式解析 提起prototype,最近看多了js相关的内容,第一印象首先是js的原型 var Person=function(name){ this.name=name; } Person.pro ...

  2. [工作中的设计模式]解释器模式模式Interpreter

    一.模式解析 解释器模式是类的行为模式.给定一个语言之后,解释器模式可以定义出其文法的一种表示,并同时提供一个解释器.客户端可以使用这个解释器来解释这个语言中的句子. 以上是解释器模式的类图,事实上我 ...

  3. [工作中的设计模式]中介模式模式Mediator

    一.模式解析 用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 中介模式又叫调停者模式,他有如下特点: 1.有多个系统或者对 ...

  4. [工作中的设计模式]策略模式stategy

    一.模式解析 策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 策略模式的关键点为: 1.多种算法存在 2.算法继承同样的接口 ...

  5. [工作中的设计模式]备忘录模式memento

    一.模式解析 备忘录对象是一个用来存储另外一个对象内部状态的快照的对象.备忘录模式的用意是在不破坏封装的条件下,将一个对象的状态捕捉(Capture)住,并外部化,存储起来,从而可以在将来合适的时候把 ...

  6. [工作中的设计模式]建造者模式builder

    一.模式解析 建造模式是将复杂的内部创建封装在内部,对于外部调用的人来说,只需要传入建造者和建造工具,对于内部是如何建造成成品的,调用者无需关心. 以上是对建造者模式的官方定义,简单说就是对于复杂对象 ...

  7. [工作中的设计模式]桥接模式bridge

    一.模式解析: 策略模式一节讲过,通过扩展持有者,使持有者形成抽象类,然后实现多个具体持有者,策略模式可以转化为桥接模式. 桥接模式定义为:将抽象部分与实现部分分离,使它们都可以独立的变化,在软件系统 ...

  8. 【转】Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式

    [转]Struts2的线程安全 和Struts2中的设计模式----ThreadLocal模式 博客分类: 企业应用面临的问题 java并发编程 Struts2的线程安全ThreadLocal模式St ...

  9. c#设计模式-组合模式

    在软件开发过程中,我们经常会遇到处理简单对象和复合对象的情况,例如对操作系统中目录的处理就是这样的一个例子,因为目录可以包括单独的文件,也可以包括文件夹,文件夹又是由文件组成的,由于简单对象和复合对象 ...

随机推荐

  1. iis搭建FTP服务器

    win7下如何开启iis请参考前一篇 使用iis并搭建 iis 图片服务器 ftp登陆格式  : ftp://[帐号]:[密码]@[IP]:[端口] ftp://用户名:密码@FTP服务器IP或域名: ...

  2. sobel算子的一些细节

    1. 形式 Gy 上下颠倒的 (*A表示卷积图像,忽略先): 看得出来,sobel算子感觉并不统一,特别是方向,我们知道matlab的图像格式是,x轴从左到右,y轴从上到下,原点在左上角. 所以,第二 ...

  3. codevs3163 抄书问题2

    题目描述 Description 现在要把M本有顺序的书分给K个人复制(抄写),每一个人的抄写速度都一样,一本书不允许给两个(或以上)的人抄写,分给每一个人的书,必须是连续的,比 如不能把第一.第三. ...

  4. nginx:413 Request Entity Too Large 及 修改 PHP上传文件大小配置

    开发环境:CentOS + Nginx + PHP + MySql + phpMyAdmin 在用 phpMyAdmin 进行 sql 数据库导入的时候,经常需要上传比较大的 sql 数据文件,而这时 ...

  5. Linux C fcntl()函数详解

    fcntl系统调用 功能描述:根据文件描述词来操作文件的特性. 用法: int fcntl(int fd, int cmd);  int fcntl(int fd, int cmd, long arg ...

  6. 如何 实现PHP多版本的 共存 和 切换?

    编译PHP时指定路径 ./configure --prefix=/opt/php/php-5.6 make && make install 这样可以PHP版本就可以安装到一个特别的路径 ...

  7. 【荐】PDO防 SQL注入攻击 原理分析 以及 使用PDO的注意事项

    我们都知道,只要合理正确使用PDO,可以基本上防止SQL注入的产生,本文主要回答以下几个问题: 为什么要使用PDO而不是mysql_connect? 为何PDO能防注入? 使用PDO防注入的时候应该特 ...

  8. nodejs配置及cmd常用操作

    一.cmd常用操作 1.返回根目录cd\ 2.返回上层目录cd .. 3.查找当前目录下的所有文件dir 4.查找下层目录cd window 二.nodejs配置 Node.js安装包及源码下载地址为 ...

  9. python——连接MySQL数据库

    都是照着说明文档来的,主要是为了以后忘记了能快一点想起来. 1. 连接 安装MySQL的时候,自动按照了Python的模块,如果没有的话,也可以在官网下载. 看什么都不如看代码来得快: import ...

  10. [转]MySQL 最基本的SQL语法/语句

    MySQL 最基本的SQL语法/语句,使用mysql的朋友可以参考下.   DDL-数据定义语言(Create,Alter,Drop,DECLARE) DML-数据操纵语言(Select,Delete ...