package composite;
import java.util.ArrayList;
import java.util.Iterator;
/**
* @author jiq
* 类型:Structural
* 定义: 组合模式(Composite)允许你讲对象组合成属性结构来表现“整体/部分”的层次结构。
* 组合能让客户以一致的方式对待这个层次结构中的个别对象以及对象组合。
*
* 用途: 这个模式能够创建一个树形结构,在同一个结构中处理嵌套菜单和菜单项。通过将
* 菜单和菜单项放在相同的结构中,我们创建了一个“整体/部分”层次结构。我们将其
* 视为一个丰富的大菜单,一旦有了这个大菜单,我们就可以使用这个模式来“统一处理
* 个别对象和组合对象”。这意味着我们可以对整个菜单结构应用相同的操作,比如打印。
* --- 当你有一个对象的集合,他们彼此之间有“整体/部分”的关系,并且你想用一致的
* 方法对待这些对象的时候,你就需要组合模式。
* --- “整体/部分”关系指的是,举个例子,用户界面,经常会看到一个顶层组件(Frame
* 或Panel)包含其他组件(菜单,文字,按钮等),所有这些单独看来都是部分,他们
* 所有加起来就是整体。
* --- “一致的方法对待这些对象”是指“组合对象”和“叶节点”对象具有共同的方法可以调用。
* 但是他们各自回做出正确的事情,组合对象会叫他的所有组件(组合对象或者叶节点)显示。
*
* 最大优势:客户不需要在操心自己面对的是组合对象还是叶节点对象,客户只需要对整个结构调用
* 一个方法并执行操作就可以了。
* 应用: 文件系统中的File对象,既可以是目录(组合对象,包含目录或者文件),也可以是文件(叶节点)。
*
*/
//抽象菜单组件,所有方法不是必须实现,所以没有声明为abstract
abstract class MenuComponent {
public void add(MenuComponent menuComponent) {
throw new UnsupportedOperationException(); }
public void remove(MenuComponent menuComponent) {
throw new UnsupportedOperationException(); }
public MenuComponent getChild(int i) {
throw new UnsupportedOperationException(); }
public String getName() {
throw new UnsupportedOperationException(); }
public double getPrice() {
throw new UnsupportedOperationException(); }
public void print() {
throw new UnsupportedOperationException(); }
}
//菜单(组合对象)
class Menu extends MenuComponent {
//菜单包含其它的(菜单/菜单项)作为子节点,即组合对象中包含其他组件(组合对象/叶节点)
ArrayList<MenuComponent> menuComponents = new ArrayList<MenuComponent>();
String name;
public Menu(String name) {
this.name = name;
}
public void add(MenuComponent menuComponent) {
menuComponents.add(menuComponent);
}
public void remove(MenuComponent menuComponent) {
menuComponents.remove(menuComponent);
}
public MenuComponent getChild(int i) {
return (MenuComponent)menuComponents.get(i);
}
public String getName() { return name; }
public void print() {
System.out.print("\n" + getName());
System.out.println("---------------------");
//使用迭代器模式遍历所有子节点
Iterator<MenuComponent> iterator = menuComponents.iterator();
while (iterator.hasNext()) {
MenuComponent menuComponent = (MenuComponent)iterator.next();
menuComponent.print();
}
}
}
//菜单项(叶节点对象)
class MenuItem extends MenuComponent {
String name;
double price;
public MenuItem(String name,double price) {
this.name = name;
this.price = price;
}
public String getName() { return name; }
public double getPrice() { return price; }
public void print() {
System.out.print(" " + getName());
System.out.println(", " + getPrice());
}
}
//测试组合模式
public class Composite {
public static void main(String[] args) {
MenuComponent pancakeHouseMenu = new Menu("PANCAKE HOUSE MENU");
MenuComponent dinerMenu = new Menu("DINER MENU");
MenuComponent cafeMenu = new Menu("CAFE MENU");
MenuComponent coffeeMenu = new Menu("COFFEE MENU");
//大菜单的根节点
MenuComponent allMenus = new Menu("ALL MENUS");
//添加节点
allMenus.add(pancakeHouseMenu);
allMenus.add(dinerMenu);
allMenus.add(cafeMenu);
pancakeHouseMenu.add(new MenuItem("K&B's Pancake Breakfast",2.99));
pancakeHouseMenu.add(new MenuItem("Regular P Breakfast",2.22));
dinerMenu.add(new MenuItem("Vegetarian BLT",3.99));
dinerMenu.add(new MenuItem("BLT",2.99));
cafeMenu.add(new MenuItem("Burrito",4.29));
cafeMenu.add(coffeeMenu);
coffeeMenu.add(new MenuItem("Coffee Cake",1.59));
allMenus.print(); //打印整个大菜单
}
}
分享到:
相关推荐
组合模式什么是组合模式Compose objects into tree structures to represent whole-part hierarch
JAVA-设计模式-结构型模式-组合模式
c++设计模式-结构型模式-组合模式;qt工程;c++简单源码; 组合(Composite Pattern)模式的定义:有时又叫作整体-部分(Part-Whole)模式,它是一种将对象组合成树状的层次结构的模式,用来表示“整体-部分”的关系...
组合模式(Composite Pattern)是一种结构型设计模式,它允许你将对象组合成树形结构以表示“部分-整体”的层次结构。这种模式使得客户端可以统一对待单个对象和对象组合。在组合模式中,有两种基本类型的对象:叶...
组合模式是一种软件设计模式,属于结构型模式,它允许我们以树形结构来表示部分与整体的关系,使得我们可以像处理单个对象一样处理整个集合。在iOS开发中,这种模式非常有用,特别是在处理数据结构或者UI组件时,...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分-整体关系,使得我们能够像处理单个对象一样处理整个集合。在Java中,这种模式的应用可以帮助我们简化对复杂对象层次结构的操作,同时保持接口的...
c++设计模式-结构型模式-桥接模式;qt工程,c++简单源码; 桥接(Bridge)模式的定义如下:将抽象与实现分离,使它们可以独立变化。它是用组合关系代替继承关系来实现,从而降低了抽象和实现这两个可变维度的耦合度...
### 设计模式实验报告——组合模式 #### 实验目的与背景 ...安全型组合模式和一致型组合模式都有各自的特点和适用场景,在不同的情况下选择合适的设计模式对于提高软件质量和可维护性具有重要意义。
组合模式,也称为树形模式,是一种结构型设计模式,它允许我们表示部分-整体层次结构,使得客户端代码可以统一地处理单个对象和对象集合。这种模式将对象组织成树形结构,允许用户对部分或整个树进行操作,简化了...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在Java中,组合模式的应用可以帮助我们构建灵活、易于维护的代码。 首先,...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们能够以统一的方式来处理单个对象和对象的组合。在组合模式中,单个对象和组合对象都被视为同一类型,这使得客户端代码可以对...
结构型模式如适配器(Adapter)、装饰器(Decorator)、代理(Proxy)和桥接(Bridge)等,关注如何组合和组装对象,使不同组件之间可以协同工作,增强系统的结构。 行为型模式如观察者(Observer)、策略...
代理模式是一种在面向对象设计中广泛应用的结构型设计模式,它提供了一种对目标对象进行间接访问的方式,使得客户端可以通过代理对象与真实对象进行交互,而无需直接接触真实对象。这样做的好处包括增加灵活性、控制...
其中,结构型设计模式关注于如何组合类或对象以形成更大的结构。本文主要探讨的是结构型设计模式中的适配器模式。 #### 适配器模式 **适配器模式**(Adapter Pattern)属于结构型设计模式,它的目的是将一个接口...
总结来说,"组合模式-空军指挥系统"这一主题涉及到Java设计模式中的组合模式理论和实践,以及如何在实际的空军指挥系统项目中应用该模式。通过组合模式,我们可以构建出层次分明、易于管理和扩展的系统,使得在复杂...
组合模式作为一种强大的设计模式,通过将对象组合成树形结构,可以表示“部分-整体”的层次结构,并统一地处理单个对象和组合对象,简化了客户端代码的复杂性,从而提高代码的灵活性和可扩展性。在实际开发中,它在...
组合模式是软件设计模式中的一种,属于结构型设计模式。其核心思想是将对象组合成树形结构以表示部分-整体的层次结构。组合模式使得客户端对单个对象和组合对象的使用具有一致性。 ### 组合模式定义 组合模式允许将...
组合模式是一种行为设计模式,属于面向对象设计中的结构型模式,其主要目的是为了建立一种对象树形结构,这种结构能够使客户端代码以统一的方式处理单个对象和对象的组合。在组合模式中,我们通常会定义一个基类,...
组合模式是一种结构型设计模式,它允许我们以树形结构来表示部分与整体的关系。在编程中,组合模式让我们能够一致地处理单个对象和对象集合,使得客户端可以无差别地对待单个对象和组合对象,实现了“部分-整体”的...
组合模式是一种结构型设计模式,它允许我们使用树形结构来表示部分与整体的关系,使得我们可以在统一的接口下处理单个对象和对象的组合。这个模式在处理类似目录树或者组织架构这样的数据时非常有用。在组合模式中,...