一、模式解析

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

组合模式的要点是:

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

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

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

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

二、模式代码

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

package component.patten;

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 display(int deepth); }

2、叶子节点

package component.patten;

import java.util.ArrayList;
import java.util.List; public class Composite extends Component {
public Composite(String name) {
super(name);
} List<Component> list=new ArrayList<Component>(); @Override
public void add(Component component) {
list.add(component);
} @Override
public void remove(Component component) {
list.remove(component);
} @Override
public void display(int deepth) {
System.out.println(this.name);
//叶子节点的方法可以调用展示所有他的子节点的方法
for(Component component:list){
StringBuffer buffer=new StringBuffer();
for (int i = 0; i < deepth; i++) {
buffer.append("--");
}
System.out.print(buffer);
component.display(deepth+1);
}
} }

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

package component.patten;

public class Leaf extends Component {

    public Leaf(String name) {
super(name);
} @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 display(int deepth) {
System.out.println("--"+this.name);
} }

4、客户端代码

package component.patten;

public class Client {
public static void main(String[] args) {
Component root=new Composite("root");
Component com1=new Composite("com1");
root.add(com1);
Component leaf1=new Leaf("leaf1");
Component leaf2=new Leaf("leaf2");
Component leaf3=new Leaf("leaf3");
com1.add(leaf1);
com1.add(leaf2);
com1.add(leaf3); Component com2=new Composite("com2");
root.add(com2);
Component leaf4=new Leaf("leaf2");
com2.add(leaf4); root.display(1);
}
}

5、执行结果

root
--com1
------leaf1
------leaf2
------leaf3
--com2
------leaf2

三、应用场景

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

四、场景代码

1、定义文件的节点

package component.example;

import java.util.ArrayList;
import java.util.List; public abstract class Node {
protected String name;
protected List<Node> list=new ArrayList<Node>();
public Node(String name){
this.name=name;
}
public abstract void add(Node node) throws Exception;
public abstract void remove(Node node) throws Exception;
public abstract void display(String path);
}

2、定义文件夹

package component.example;

/**
* 文件夹
* @author zjl
* @time 2016-2-2
*
*/
public class Folder extends Node { public Folder(String name) {
super(name);
} @Override
public void add(Node node) {
list.add(node);
} @Override
public void remove(Node node) {
list.remove(node);
} @Override
public void display(String path) {
path+="/"+this.name;
for(Node node:list){
node.display(path);
}
} }

3、定义文件

package component.example;

public class File extends Node {

    public File(String name) {
super(name);
} @Override
public void add(Node node) throws Exception {
throw new Exception("不支持此方法");
} @Override
public void remove(Node node) throws Exception {
throw new Exception("不支持此方法");
} @Override
public void display(String path) {
System.out.println(path+"/"+this.name);
} }

4、客户端

package component.example;

public class Client {
public static void main(String[] args){
Folder document = new Folder("我的资料"); //我的资料文件夹
File book = new File("Java编程思想.pdf"); //文档文件
Folder music = new Folder("我的音乐"); //我的音乐文件夹
File music1 = new File("你是我的眼.mp3"); //音乐文件1
File music2 = new File("Without You.mp3"); //音乐文件2
//确定树形结构关系
document.add(book);
document.add(music);
music.add(music1);
music.add(music2); document.display(""); }
}

5、运行结果

/我的资料/Java编程思想.pdf
/我的资料/我的音乐/你是我的眼.mp3
/我的资料/我的音乐/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. ionic ios发布图标启动也不能正确加载问题

    前两天发布ios的时候发现ios安装的图标和启动页的时候不能正确显示,重新发布也不能正确显示,修改方法 在ionic build ios --release之前执行ionic resources即可

  2. java -日期处理

    1. 计算某年某月份 总有多少个周,每周的开始和结束时间? 思路:1.计算出本月实际的总天数 2.循环每一天,判断这天是否是 周日(1),如果是,周数加1,再次判断是否是月的第一个周一,如是,开始时间 ...

  3. 让Web页面中的编辑器支持黏贴或直接拖拽来添加图片

    基本原理是将剪贴板中的图片二进制数据转为Base64编码 代码: <html> <head> </head> <body> <script src ...

  4. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  5. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  6. Alpha版本十天冲刺——Day 1

    站立式会议 会议总结 队员 今天完成 遇到的问题 明天要做 感想 鲍亮 α版本接口文档初步编写,任务统筹 绘制燃尽图出错 学习http资源访问,服务器请求接口demo测试 作为PM,之前对团队具体要做 ...

  7. iOS应用动态部署方案

    iOS的动态部署能极大的节约成本.苹果的审核周期很长,有的时候,你可能不得不等待将近2个星期去上架你的新功能或者bug.所以动态部署是有价值的. 我这里讨论的情况不把纯web应用考虑在内,因为用户体验 ...

  8. Android 全局获取 Context 与使用 Intent 传递对象

    =====================全局获取 Context======================== Android 开发中很多地方需要用到 Context,比如弹出 Toast.启动活 ...

  9. Python下RSA加密/解密, 签名/验证

    原文是py2环境,而我的环境是py3,所以对原代码做了修改:decode(), encode() import rsa # 生成密钥 (pubkey, privkey) = rsa.newkeys(1 ...

  10. SVN 删除误上传到服务器的文件

    使用Axure软件的时候,不小心把一些无用的文档也提交到了SVN上了. 当更新服务器上的文件到本地,然后删除误提交的文件时,出现了一个错误,见下图:   错误:cannot verify lock o ...