23种设计模式(10)java组合模式

23种设计模式第四篇:java组合模式

介绍

组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕.

组合模式可以优化处理递归或分级数据结构.有许多关于分级数据结构的例子,使得组合模式非常有用武之地.

类图


组成部分:

Component: 为参加组合的对象声明一个公共接口, 不管是组合还是叶结点.
Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点.
Composite: 表示参加组合的有子对象的对象, 并给出树枝购件的行为.

实例

FolderComponent

public abstract class FolderComponent {
 private String name;

 public String getName() {
 return name;
 }

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

 public FolderComponent() {
 }

 public FolderComponent(final String name) {
 this.name = name;
 }

 public abstract void add(FolderComponent component);

 public abstract void remove(FolderComponent component);

 public abstract void display();
}

FileLeaf

public class FileLeaf extends FolderComponent {
 public FileLeaf(final String name) {
 super(name);
 }

 @Override
 public void add(final FolderComponent component) {
 // ...
 }

 @Override
 public void remove(final FolderComponent component) {
 // ...
 }

 @Override
 public void display() {
 System.out.println("FileLeaf:" + this.getName());
 }
}

FolderComposite

public class FolderComposite extends FolderComponent {
 private final List<FolderComponent> components;

 public FolderComposite(final String name) {
 super(name);
 this.components = new ArrayList<FolderComponent>();
 }

 public FolderComposite() {
 this.components = new ArrayList<FolderComponent>();
 }

 @Override
 public void add(final FolderComponent component) {
 this.components.add(component);
 }

 @Override
 public void remove(final FolderComponent component) {
 this.components.remove(component);
 }

 @Override
 public void display() {
 System.out.println("FolderComposite---name:" + this.getName());
 for (final FolderComponent component : components) {
  System.out.println("FolderComposite---component-name:" + component.getName());
 }
 }
}

Client

public class Client
{
 public static void main(final String[] args)
 {
  final FolderComponent leaf = new FileLeaf("runnable file");
  leaf.display();

  final FolderComponent folder = new FolderComposite("new folder");
  folder.add(new FileLeaf("content1 in new folder"));
  folder.add(new FileLeaf("content2 in new folder"));
  folder.display();
 }
}

输出结果:

FileLeaf:runnable file
FolderComposite---name:new folder
FolderComposite---component-name:content1 in new folder
FolderComposite---component-name:content2 in new folder

使用场景

以下情况下适用Composite模式:

1、你想表示对象的部分-整体层次结构
        2、你希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

总结

组合模式解耦了客户程序与复杂元素内部结构,从而使客户程序可以向处理简单元素一样来处理复杂元素。
        如果你想要创建层次结构,并可以在其中以相同的方式对待所有元素,那么组合模式就是最理想的选择。本章使用了一个文件
        系统的例子来举例说明了组合模式的用途。在这个例子中,文件和目录都执行相同的接口,这是组合模式的关键。通过执行相同的接口,你就可以用相同的方式对待文件和目录,从而实现将文件或者目录储存为目录的子级元素。

转自:java知音

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

(0)

相关推荐

  • 23种设计模式(2) java工厂模式

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口,以便将创建对象的具体过程屏蔽隔离起来,达到提高灵活性的目的. 工厂模式根据抽象程度的不同分为三种: 简单工厂模式(也叫静态工厂模式) 工厂方法模式(也叫多形性工厂) 抽象工厂模式(也叫工具箱) 简单工厂模式 实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接

  • 23种设计模式(5) java适配器模式

    23种设计模式第五篇:java适配器模式 定义: 将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. 角色: 目标(Target)角色:这就是所期待得到的接口,也就是这类的接口是符合我们要求的. 源(Adapee)角色:我们要使用的接口,但是这个接口不符合我们的要求,也就是现在需要适配的接口. 适配器(Adaper)角色:适配器类是适配器模式的核心.适配器把源接口转换成目标接口.显然,这一角色不可以是接口,而必须是具体类. 分类: 1

  • 23种设计模式(8) java外观模式

    23种设计模式第八篇:java外观模式 定义: 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用. 角色: 1.外观(Facade)角色 :客户端可以调用这个角色的方法.此角色知晓相关子系统的功能和责任.在正常情况下,本角色会将所有从客户端发来的请求委派到相应的子系统去. 2.子系统(SubSystem)角色 :可以同时有一个或者多个子系统.每个子系统都不是一个单独的类,而是一个类的集合.每个子系统都可以被客户端直接调用,或者被外观角

  • 23种设计模式(3) java原型模式

    23种设计模式第三篇:java原型模式 定义: 通过复制现有的对象实例来创建新的对象实例. 实现: 实现Cloneable接口: Cloneable接口的作用是在运行时通知虚拟机可以安全地在实现了此接口的类上使用clone方法.在java虚拟机中,只有实现了这个接口的类才可以被拷贝,否则在运行时会抛出CloneNotSupportedException异常. 重写Object类中的clone方法: Java中,所有类的父类都是Object类,Object类中有一个clone方法,作用是返回对象的

  • 23种设计模式(1) java单例模式

    23种设计模式第四篇:java单例模式 定义: 单例模式,是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例的特殊类.通过单例模式可以保证系统中一个类只有一个实例.即一个类只有一个对象实例. 特点: 1.单例类只能有一个实例. 2.单例类必须自己自己创建自己的唯一实例. 3.单例类必须给所有其他对象提供这一实例 单例模式的要点: 1.私有的构造方法     2.指向自己实例的私有静态引用     3.以自己实例为返回值的静态的公有的方法 单例模式根据实例化对象时机的不同分为两种: 一

  • 23种设计模式(6) java装饰者模式

    23种设计模式第六篇:java装饰者模式 定义: 在不必改变原类文件和原类使用的继承的情况下,动态地扩展一个对象的功能.     它是通过创建一个包装对象,也就是用装饰来包裹真实的对象来实现. 角色: 抽象构件角色(Project):给出一个接口,以规范准备接收附加责任的对象.     具体构件角色(Employe):定义一个将要接收附加责任的类.     装饰角色(Manager):持有一个构件对象的实例,并定义一个与抽象构件接口一致的接口.     具体装饰角色(ManagerA.Manag

  • 23种设计模式(4) java生成器模式

    23种设计模式第四篇:java生成器模式 定义: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示.生成器模式利用一个导演者对象和具体建造者对象一个一个地建造出所有的零件,从而建造出完整的对象. 四个要素: Builder:生成器接口,定义创建一个Product对象所需要的各个部件的操作.         ConcreteBuilder:具体的生成器实现,实现各个部件的创建,并负责组装Product对象的各个部件,同时还提供一个让用户获取组装完成后的产品对象的方法.   

  • 23种设计模式(7) java代理模式

    23种设计模式第七篇:java代理模式 定义: 为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用 角色: 1.抽象角色:声明真实对象和代理对象的共同接口. 2.代理角色:代理对象角色内部含有对真实对象的引用,从而可以操作真实对象,同时代理对象提供与真实对象相同的接口以便在任何时刻都能代替真实对象.同时,代理对象可以在执行真实对象操作时,附加其他的操作,相当于对真实对象进行封装. 3.真实角色:

  • 23种设计模式(9) java桥接模式

    介绍 桥接模式 (Bridge)将抽象部分与实现部分分离,使它们都可以独立的变化. 桥接模式是一种结构式模式. 结构 代码实现 Implementor : 定义实现接口. interface Implementor { // 实现抽象部分需要的某些具体功能 public void operationImpl(); } Abstraction : 定义抽象接口. abstract class Abstraction { // 持有一个 Implementor 对象,形成聚合关系 protected

  • Java设计模式之java组合模式详解

    目录 引言 组合模式介绍 角色 模式结构 示例代码 水果盘 文件浏览 更复杂的组合模式 透明与安全 透明组合模式 安全组合模式 组合模式总结 优点 缺点 适用场景 应用 XML文档解析 文件 HashMap Mybatis SqlNode中的组合模式 参考文章 总结 引言 树形结构不论在生活中或者是开发中都是一种非常常见的结构,一个容器对象(如文件夹)下可以存放多种不同的叶子对象或者容器对象,容器对象与叶子对象之间属性差别可能非常大. 由于容器对象和叶子对象在功能上的区别,在使用这些对象的代码中

  • 23种设计模式(10)java组合模式

    23种设计模式第四篇:java组合模式 介绍 组合模式又叫做部分-整体模式,它使我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解藕. 组合模式可以优化处理递归或分级数据结构.有许多关于分级数据结构的例子,使得组合模式非常有用武之地. 类图 组成部分: Component: 为参加组合的对象声明一个公共接口, 不管是组合还是叶结点. Leaf: 在组合中表示叶子结点对象,叶子结点没有子结点. Composit

  • 23种设计模式(12)java模版方法模式

    23种设计模式第四篇:java模版方法模式 定义:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤. 类型:行为类模式 类图: 事实上,模版方法是编程中一个经常用到的模式.先来看一个例子,某日,程序员A拿到一个任务:给定一个整数数组,把数组中的数由小到大排序,然后把排序之后的结果打印出来.经过分析之后,这个任务大体上可分为两部分,排序和打印,打印功能好实现,排序就有点麻烦了.但是A有办法,先把打印功能完成,排序功能另找人做. abs

  • 23种设计模式(15)java解释器模式

    23种设计模式第十五篇:java解释器模式 定义:给定一种语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中句子. 类型:行为类模式 类图: 解释器模式是一个比较少用的模式,本人之前也没有用过这个模式.下面我们就来一起看一下解释器模式. 解释器模式的结构 抽象解释器:声明一个所有具体表达式都要实现的抽象接口(或者抽象类),接口中主要是一个interpret()方法,称为解释操作.具体解释任务由它的各个实现类来完成,具体的解释器分别由终结符解释器TerminalExpr

  • 23种设计模式(20)java中介者模式

    23种设计模式第二十篇:java中介者模式 定义:用一个中介者对象封装一系列的对象交互,中介者使各对象不需要显示地相互作用,从而使耦合松散,而且可以独立地改变它们之间的交互. 类型:行为类模式 类图: 中介者模式的结构 中介者模式又称为调停者模式,从类图中看,共分为3部分: 抽象中介者:定义好同事类对象到中介者对象的接口,用于各个同事类之间的通信.一般包括一个或几个抽象的事件方法,并由子类去实现. 中介者实现类:从抽象中介者继承而来,实现抽象中介者中定义的事件方法.从一个同事类接收消息,然后通过

  • 23种设计模式(16)java访问者模式

    23种设计模式第十六篇:java访问者模式 定义:封装某些作用于某种数据结构中各元素的操作,它可以在不改变数据结构的前提下定义作用于这些元素的新的操作. 类型:行为类模式 类图: 访问者模式可能是行为类模式中最复杂的一种模式了,但是这不能成为我们不去掌握它的理由. 我们首先来看一个简单的例子,代码如下 class A { public void method1(){ System.out.println("我是A"); } public void method2(B b){ b.sho

  • 23种设计模式(17)java命令模式

    23种设计模式第十七篇:java命令模式 定义:将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和恢复功能. 类型:行为类模式 类图: 命令模式的结构 顾名思义,命令模式就是对命令的封装,首先来看一下命令模式类图中的基本结构: Command类:是一个抽象类,类中对需要执行的命令进行声明,一般来说要对外公布一个execute方法用来执行命令. ConcreteCommand类:Command类的实现类,对抽象类中声明的方法进行实现.

随机推荐