3. 组合模式(Composite Pattern)
组合模式可以让我们把对象按照树状结构进行组织,可以想象成菜单的概念,菜单下面有子菜单,也会有菜单项,使用了组合模式,我们可以在"子菜单"(组合对象)和"菜单项"(个体对象)上使用相同的操作,也就是说在多数的情况下是不用去区分它们的。
我们还是来举个例子,就是上边说的菜单的例子,我们来建立的一个结构来表示菜单,子菜单和菜单项的组合。
首先定义一个菜单组件的抽象基类,它定义了菜单操作的基本方法,比如#add(),#remove(),#getChild();另外还定义了菜单的行为方法,#getName(),printMenu()。
/**
* 抽象菜单组件基类<br>
*
* @author archer
*
*/
public abstract class MenuComponent {
/**
* 增加菜单组件(可能是菜单项或者子菜单)<br>
*
* @param menuComponent
*/
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
/**
* 移除菜单组件<br>
*
* @param menuComponent
*/
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException();
}
/**
* 返回子菜单组件<br>
*
* @param i
* @return
*/
public MenuComponent getChild(int i) {
throw new UnsupportedOperationException();
}
/**
* 返回菜单项目或者菜单的名字<br>
*
* @return
*/
public String getName() {
throw new UnsupportedOperationException();
}
/**
* 打印菜单<br>
*
*/
public void printMenu() {
throw new UnsupportedOperationException();
}
}
接下来就是菜单项和菜单类了,它们都是MenuComponent的子类。
/**
* 菜单项<br>
*
* @author archer
*
*/
public class MenuItem extends MenuComponent {
private String name = null;
public MenuItem(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public void printMenu() {
System.out.println("\t" + this.getName());
}
}
/**
* 菜单<br>
*
* @author archer
*
*/
public class Menu extends MenuComponent {
private List<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
private String name = null;
public Menu(String name) {
this.name = name;
}
@Override
public String getName() {
return this.name;
}
@Override
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
@Override
public MenuComponent getChild(int i) {
return menuComponents.get(i);
}
@Override
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
@Override
public void printMenu() {
System.out.println(this.getName());
System.out.println("--------------------");
// 这里用到了Iterator模式
Iterator<MenuComponent> iter = menuComponents.iterator();
while (iter.hasNext()) {
MenuComponent component = iter.next();
component.printMenu();
}
}
}
通过这种方式,我们就可以在实现一种"整体 -- 局部"关系的同时,又实现了对组合对象与单一对象的统一对待,简化了编程。
接下来可以看一下使用上边例子的客户端代码,这个客户端模拟了eclipse的菜单。
public class Client {
public static void main(String[] args) {
// 总菜单
MenuComponent allMenu = new Menu("Eclipse Menu DEMO");
// "File"子菜单
MenuComponent fileMenu = new Menu("File");
// "New"子菜单
MenuComponent newMenu = new Menu("New");
// "New"的菜单项
MenuComponent EAPMenuItem = new MenuItem("Enterprise Application Project");
MenuComponent DWPMenuItem = new MenuItem("Dynamic Web Project");
MenuComponent EJBMenuItem = new MenuItem("EJB Project");
newMenu.add(EAPMenuItem);
newMenu.add(DWPMenuItem);
newMenu.add(EJBMenuItem);
fileMenu.add(newMenu);
// "Edit"子菜单
MenuComponent editMenu = new Menu("Edit");
// "Edit"的菜单项
MenuComponent CutMenuItem = new MenuItem("Cut");
MenuComponent CopyMenuItem = new MenuItem("Copy");
MenuComponent PasteMenuItem = new MenuItem("Paste");
editMenu.add(CutMenuItem);
editMenu.add(CopyMenuItem);
editMenu.add(PasteMenuItem);
allMenu.add(fileMenu);
allMenu.add(editMenu);
// 打印菜单
allMenu.printMenu();
}
}
它的运行结果如下:
Eclipse Menu DEMO
--------------------
File
--------------------
New
--------------------
Enterprise Application Project
Dynamic Web Project
EJB Project
Edit
--------------------
Cut
Copy
Paste
这样,组合模式就基本讲解完了,最后给出组合模式的类图:
- 大小: 18.2 KB
分享到:
相关推荐
c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...
JAVA-设计模式-结构型模式-组合模式
组合模式,也称为树形模式,是一种结构型设计模式,它允许我们表示部分-整体层次结构,使得客户端代码可以统一地处理单个对象和对象集合。这种模式将对象组织成树形结构,允许用户对部分或整个树进行操作,简化了...
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...
【例3.2】组合模式-五子棋代码 【例3.3】组合模式-空军指挥系统 【例3.4】组合模式-世界问候语 【例3.7】类适配器模式-客户信息验证 【例3.8】对象适配器模式-字符串排序 【例3.10】外观模式-安全...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们可以在统一的接口下处理单个对象和对象的组合。这个模式在处理类似目录树或者组织架构这样的数据时非常有用。在组合模式中,...
三、组合设计模式的意图 将对象组合成树结构,以表示部分 - 整体层次结构。组合设计模式允许客户端统一对待单个对象和对象的组合。 四、组合模式的详细解释及实际示例 实际示例: 在一个现实世界的例子中,考虑一个...
组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在Java中,组合模式的应用可以帮助我们构建灵活、易于维护的代码。 首先,...
总结来说,"组合模式-空军指挥系统"这一主题涉及到Java设计模式中的组合模式理论和实践,以及如何在实际的空军指挥系统项目中应用该模式。通过组合模式,我们可以构建出层次分明、易于管理和扩展的系统,使得在复杂...
本实验报告主要探讨了五个关键的设计模式:组合模式、外观模式、代理模式、观察者模式以及策略模式,这些都是软件体系结构中的重要组成部分,对于理解和优化代码结构具有深远影响。 1. **组合模式**: 组合模式是一...
设计模式10-代理模式、结构型模式大复习 设计模式11-行为模式-责任链、命令模式 设计模式12-解释器模式 设计模式13-迭代器模式 设计模式14-中介者模式、备忘录模式 设计模式15-观察者模式、状态模式 设计模式16-策略...
组合模式是一种软件设计模式,属于结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得我们可以像处理单个对象一样处理整个集合。在iOS开发中,这种模式非常有用,特别是在处理数据结构或者UI组件时,...
组合模式(Composite Pattern)是一种结构型设计模式,它允许用户将对象组合成树形结构来表示部分-整体层次结构。该模式使得用户对单个对象和组合对象的使用具有一致性。 #### 实验内容 实验内容主要包括设计和实现...
这种类型的设计模式属于结构型模式,它创建了对象组的树形结构。 这种模式创建了一个包含自己对象组的类。该类提供了修改相同对象组的方式。 我们通过下面的实例来演示组合模式的用法。实例演示了一个组织中员工的...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...
设计模式分为三大类:创建型模式、结构型模式和行为型模式。它们分别处理对象的创建、组合以及对象间的行为交互。 1. 创建型模式:包括单例模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式。这些模式主要...
本书还附带了一些基础类库的介绍,例如列表(List)、迭代器(Iterator)、列表迭代器(ListIterator)、点(Point)、矩形(Rect)等,这些都是在实现设计模式时常用的数据结构。 #### 十一、参考文献与索引 **参考文献与...
在IT行业中,软件体系结构设计模式是开发高质量、可维护和可扩展的软件系统的关键要素。设计模式是一种在特定上下文中解决常见问题的最佳实践,它为软件设计提供了可重用的解决方案。本作业将深入探讨软件体系结构...
在本文中,我们将深入探讨结构型设计模式,特别是桥接模式、适配器模式、装饰者模式和组合模式,以及它们在实际场景中的应用。 1. **桥接模式**: 桥接模式将抽象部分与实现部分分离,使得它们可以独立进行变化。...