轻松掌握java组合模式

组合模式,将对象组合成树形结构以表示“部分-整体”的层次结构,组合模式使得用户对单个对象和组合对象的使用具有一致性,组合模式可以让客户端像修改配置文件一样简单的完成本来需要流程控制语句来完成的功能。

特点:对于递归或者类似树形的分级数据结构,可以用最简单的方式进行处理。

企业级开发和常用框架中的应用:系统目录结构和网站导航结构

下面以目录结构举例:

场景:假设我们现在有一个目录,目录下面还有子目录和文件,现在我们要查看整个目录及目录下的所有文件和创建时间

具体代码如下:

package com.test.composite;

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

public class Demo {
 public static void main(String[] args) {

 Date d = new Date();
 Dir f1 = new Dir("我的收藏", d);
 d.setYear(2012);
 Dir f2 = new Dir("图片", d);
 Dir f3 = new Dir("音乐", d);

 d.setYear(2013);
 ActualFile f4 = new ActualFile("喜洋洋与灰太狼.avi", d);
 f1.add(f4);
 ActualFile f5 = new ActualFile("taiyanghua.jpg", d);
 ActualFile f6 = new ActualFile("变形精钢.jpg", d);
 f2.add(f5);
 f2.add(f6);
 f1.add(f2);
 f1.add(f3);

 f1.showFile();

 }
}

/**
 * 首先目录和文件都属于文件,所以我们可以抽象一个抽象文件出来
 */
interface AbstractFile {
 /**
 * 展示文件方法
 */
 public void showFile();
}

/**
 * 真实文件
 */
class ActualFile implements AbstractFile {

 private String name;
 private Date createDate;

 public ActualFile(String name, Date createDate) {
 this.name = name;
 this.createDate = createDate;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public Date getCreateDate() {
 return createDate;
 }

 public void setCreateDate(Date createDate) {
 this.createDate = createDate;
 }

 /**
 * 实现抽象文件类的展示文件方法
 */
 public void showFile() {
 System.out.println("文件名:"+this.name+"--创建时间:"+this.createDate.getTime());
 }

}

/**
 * 目录文件
 */
class Dir implements AbstractFile {

 private String name;
 private Date createDate;

 /**
 * 作为目录文件,会多出一个子文件列表
 */
 private List<AbstractFile> list = new ArrayList<>();

 public Dir(String name, Date createDate) {
 super();
 this.name = name;
 this.createDate = createDate;
 }

 public String getName() {
 return name;
 }

 public void setName(String name) {
 this.name = name;
 }

 public Date getCreateDate() {
 return createDate;
 }

 public void setCreateDate(Date createDate) {
 this.createDate = createDate;
 }

 /**
 * 目录文件的添加操作,为目录添加子文件或者子目录
 */
 public void add(AbstractFile f){
 this.list.add(f);
 }

 /**
 * 目录文件的删除操作,删除子文件或者子目录
 */
 public void remove(AbstractFile f){
 this.list.remove(f);
 }

 /**
 * 目录文件的获取操作,获取目录下面的子文件或者子目录
 */
 public AbstractFile getIndex(int index){
 return this.list.get(index);
 }

 public void showFile() {
 System.out.println("目录名:"+this.name+"--创建时间:"+this.createDate.getTime());
 for(AbstractFile f:list){
  f.showFile();
 }
 }

}

组合模式更像是一种遍历手段,但是这种手段也有一些限制,比如只能针对类似于树形结构的数据。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Java设计模式之工厂模式(Factory模式)介绍

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经常要根据类Class生成实例对象,如A a=new A() 工厂模式也是用来创建实例对象的,所以以后new时就要多个心眼,是否可以考虑实用工厂模式,虽然这样做,可能多做一些工作,但会给你系统带来更大的可扩展性和尽量少的修改量. 我们以类Sample为例,

  • Java设计模式之适配器模式(Adapter模式)介绍

    适配器模式定义:将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 为何使用适配器模式 我们经常碰到要将两个没有关系的类组合在一起使用,第一解决方案是:修改各自类的接口,但是如果我们没有源代码,或者,我们不愿意为了一个应用而修改各自的接口. 怎么办? 使用Adapter,在这两种接口之间创建一个混合接口(混血儿). 如何使用适配器模式 实现Adapter方式,其实"think in Java"的"类再生&quo

  • java设计模式之单例模式学习

    1 概述 单例模式有几个好处: (1)某些类创建比较频繁,对于一些大型的对象,这是一笔很大的系统开销. (2)省去了new操作符,降低了系统内存的使用频率,减轻GC压力. (3)有些类如交易所的核心交易引擎,控制着交易流程,如果该类可以创建多个的话,系统完全乱了. 2 详解 单例模式常用的写法有如下这么两种. 2.1 饿汉式 如果应用程序总是创建并使用单例模式,或者在创建和运行时压力不是很大的情况下,可以使用一个私有静态变量,提前把对象创建好. 复制代码 代码如下: package org.sc

  • JAVA设计模式之组合模式原理与用法详解

    本文实例讲述了JAVA设计模式之组合模式.分享给大家供大家参考,具体如下: 组合(整体与部分关系)模式:将不同但是相关的对象组合成树形结构以实现"部分-整体"的层次结构,使得用户对单个对象和组合对象的使用具有一致性. * 模式角色组成: 1.Component对象: 是组合中的对象接口,是所有类共有的接口.是用于统一定义整体中的部分. 2.Leaf对象: 整体中的部分,没有下一级. 3.Composite对象: 用来存储子部件,在Component接口中实现与部分有关操作. 以公司构成

  • java设计模式之组合模式(Composite)

    概述 是一种结构型模式,将对象以树形结构组织起来,以表示"部分 - 整体"的层次结构,使得客户端对单个对象和组合对象的使用具有唯一性. UML类图 上面的类图包含的角色: Component:为参加组合的对象声明一个公共的接口,不管是组合还是叶节点. Leaf:在组合中表示叶子结点对象,叶子结点没有子结点. Composite:表示参加组合的有子对象的对象,并给出树枝构建的行为: 代码示例 import java.util.ArrayList; import java.util.Lis

  • Java设计模式之模板模式(Template模式)介绍

    Template模式定义:定义一个操作中算法的骨架,将一些步骤的执行延迟到其子类中. 其实Java的抽象类本来就是Template模式,因此使用很普遍.而且很容易理解和使用,我们直接以示例开始: 复制代码 代码如下: public abstract class Benchmark { /** * 下面操作是我们希望在子类中完成 */ public abstract void benchmark(); /** * 重复执行benchmark次数 */ public final long repea

  • Java设计模式之装饰者模式详解和代码实例

    装饰者模式可以给已经存在的对象动态的添加能力.下面,我将会用一个简单的例子来演示一下如何在程序当中使用装饰者模式. 1.装饰者模式 让我们来假设一下,你正在寻找一个女朋友.有很多来自不同国家的女孩,比如:美国,中国,日本,法国等等,他们每个人都有不一样的个性和兴趣爱好,如果需要在程序当中模拟这么一种情况的话,假设每一个女孩就是一个Java类的话,那么就会有成千上万的类,这样子就会造成类的膨胀,而且这样的设计的可扩展性会比较差.因为如果我们需要一个新的女孩,就需要创建一个新的Java类,这实际上也

  • 详解设计模式中的proxy代理模式及在Java程序中的实现

    一.代理模式定义 给某个对象提供一个代理对象,并由代理对象控制对于原对象的访问,即客户不直接操控原对象,而是通过代理对象间接地操控原对象. 著名的代理模式的例子就是引用计数(reference counting): 当需要一个复杂对象的多份副本时, 代理模式可以结合享元模式以减少存储器的用量.典型做法是创建一个复杂对象以及多个代理者, 每个代理者会引用到原本的对象.而作用在代理者的运算会转送到原本对象.一旦所有的代理者都不存在时, 复杂对象会被移除. 要理解代理模式很简单,其实生活当中就存在代理

  • Java设计模式之组合模式(Composite模式)介绍

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Composite就应该想到树形结构图.组合体内这些对象都有共同接口,当组合体一个对象的方法被调用执行时,Composite将遍历(Iterator)整个树形结构,寻找同样包含这个方法的对象并实现调用执行.可以用牵一动百来形容. 所以Composite模式使用到Iterator模式,和Chain of Responsi

  • java设计模式之实现对象池模式示例分享

    ObjectPool抽象父类 复制代码 代码如下: import java.util.Iterator;import java.util.Vector; public abstract class ObjectPool<T> { private Vector<T> locked, unlocked;   // locked是已占用的对象集合,unlocked是可用对象集合 public ObjectPool() {    locked = new Vector<T>()

  • Java设计模式之责任链模式(Chain of Responsibility模式)介绍

    Chain of Responsibility定义:Chain of Responsibility(CoR) 是用一系列类(classes)试图处理一个请求request,这些类之间是一个松散的耦合,唯一共同点是在他们之间传递request.也就是说,来了一个请求,A类先处理,如果没有处理,就传递到B类处理,如果没有处理,就传递到C类处理,就这样象一个链条(chain)一样传递下去. 如何使用责任链模式 虽然这一段是如何使用CoR,但是也是演示什么是CoR. 有一个Handler接口: 复制代码

随机推荐