Composite——组合模式
来源:互联网 发布:淘宝达人申请入口链接 编辑:程序博客网 时间:2024/06/04 23:18
一、定义
GOF中对Composite模式这样描述:将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。
组合涉及的是一组对象,其中有的对象可能包含有其他的对象,因此,有的对象可能代表一个对象群组,而有的则是单个对象。组合模式包括两个重要的建模概念:1.所设计的群组既要能包含单个个体,又要能包含其他群组。数据结构很自然的有递归特性。2.定义出单个对象和对象群组的公共特性(接口)。将公共接口提供给用户,用户可以用统一的接口处理单个对象以及组合对象。这里体现了面向对象设计的一个原则:将变化的与不变的分离开来。
二、场景设计
符合组合模式的典型例子就是文件系统的目录树结构。这里以Hadoop的HDFS文件系统为例,单个文件和文件目录分别用INodeFile和INodeDirectory来描述。每个INodeDirectory中可能还包含多个INodeFile和INodeDirectory。在INodeFile和INodeDirectory的上层,还有一个INode 抽象类,其中抽象了INodeFile和INodeDirectory的公共接口和属性。
三、类结构图
用户使用Component类接口与组合结构中的对象进行交互。如果接收者是一个叶节点,则直接处理请求。如果接受者是一个Composite,则通常将请求转发给他的子部件,在转发请求之前或之后可能要执行一些辅助操作。
四、代码示例
INode.java
public interface INode {int getFileNum();void Add(INode node);void Remove(INode node);void OutputInfo();}
INodeFile.java
public class INodeFile implements INode {String name;INodeFile(String name){this.name=name;}@Overridepublic int getFileNum() {// TODO Auto-generated method stubreturn 1;}@Overridepublic void Add(INode node) {// TODO Auto-generated method stubSystem.out.println("File-----No subdirectory");}@Overridepublic void Remove(INode node) {// TODO Auto-generated method stubSystem.out.println("File-----No subdirectory");}@Overridepublic void OutputInfo() {// TODO Auto-generated method stubSystem.out.print("file: "+name+"|");}}
INodeDirectory.java
import java.util.*;public class INodeDirectory implements INode {private LinkedList<INode> list;String name;INodeDirectory(String name){this.name=name;list=new LinkedList<INode>();}@Overridepublic int getFileNum() {// TODO Auto-generated method stubint sum=0;for(INode temp:list){sum+=temp.getFileNum();}return sum;}@Overridepublic void Add(INode node) {// TODO Auto-generated method stublist.add(node);}@Overridepublic void Remove(INode node) {// TODO Auto-generated method stublist.remove(node);}@Overridepublic void OutputInfo() {// TODO Auto-generated method stubSystem.out.print("directory: "+name+"|");int i=0;for(INode temp:list){temp.OutputInfo();}System.out.println("");}}
Client.java
public class Client {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubINode plant=new INodeDirectory("plant");INode root=new INodeDirectory("root");INode music=new INodeFile("music");INode pdf=new INodeFile("pdf");INode movie=new INodeFile("movie");plant.Add(music);plant.Add(pdf);plant.Add(movie);INode book=new INodeFile("book");root.Add(plant);root.Add(book);System.out.println(root.getFileNum());root.OutputInfo();}}
运行结果:
4
directory: root|directory: plant|file: music|file: pdf|file: movie|
file: book|
- 组合模式——Composite
- Composite——组合模式
- 组合模式——composite
- 【设计模式】—— 组合模式Composite
- Java设计模式 —— 组合(Composite)
- 组合模式(Composite)——Java
- 设计模式(13)——Composite 组合模式
- java设计模式11——组合模式(Composite)
- 设计模式——组合模式(Composite Pattern)
- Android与设计模式——组合(Composite)模式
- 设计模式(8)——Composite(组合)模式
- 设计模式(10)——组合模式(Composite Pattern)
- C++设计模式——Composite 组合模式
- (结构型模式)COMPOSITE——组合模式
- 设计模式 —— 组合模式(Composite Pattern)
- java设计模式——组合模式(Composite Pattern)
- Java设计模式——组合模式(Composite Pattern)
- 设计模式学习笔记——组合(Composite)模式
- 简单记事本及目录树形图的Java实现
- C++5中内存分配方法,堆 栈 静态存储区 全局/静态变量 自由存储区
- 破解手机的任意收费游戏
- 解决dns劫持,网页重定向114
- Android Handler的机制和原理(二)
- Composite——组合模式
- JSON 还是 XML?
- Extjs4框架的搭建
- php日期格式
- Ubuntu下deb包的安装方法
- WEB应用程序
- 获取当前应用的版本号和当前android系统的版本号
- android从图库(gallery)选择一张图片
- 文件名过滤器修改后缀名再复制保存的Java实现