设计模式:18、组合模式

目录

0、定义

1、组合模式的三种角色

2、组合模式的UML类图

3、示例代码


0、定义

将对象组合成树形结构以表示"部分-整体"的层次结构。Composite使用户对单个对象和组合对象的使用具有一致性。

1、组合模式的三种角色

  • 抽象组件(Component):是一个接口(抽象类),该接口(抽象类)定义了个体对象 和组合对象 需要实现的关于操作其子节点的方法,比如add()、remove()以及getChild()等方法。抽象组件 也可以定义个体对象 和组合对象用于操作其自身的方法。
  • Composite节点(Composite Node):实现Component接口类的实例,Composite节点 不仅实现Component接口 ,而且可以含有其他Composite节点 或Leaf节点的引用。
  • Leaf节点(Leaf Node):实现Component接口 类的实例,Leaf节点 实现Component接口,不可以含有其他Composite节点 或Leaf节点 的引用,因此,叶节点 在实现Component接口有关操作子节点的方法时,比如add()、remove()和getChild()方法,可让方法抛出一个异常,也可以实现为空操作。

2、组合模式的UML类图

3、示例代码

抽象组件

java 复制代码
package xyz.jangle.design.composite;
/**
 * 抽象组件
 * @author Administrator
 *
 */
public interface Component {
	public void add(Component component);
	public void remove(Component component);
	public Component getChild(int i);
	public void opration();

}

Composite节点(组合节点)

java 复制代码
package xyz.jangle.design.composite;

import java.util.Iterator;
import java.util.LinkedList;
/**
 * Composite节点
 * @author Administrator
 *
 */
public class Composite implements Component {
	
	private LinkedList<Component> child;

	public Composite() {
		super();
		child = new LinkedList<Component>();
	}

	@Override
	public void add(Component component) {
		child.add(component);
	}

	@Override
	public void remove(Component component) {
		child.remove(component);
	}

	@Override
	public Component getChild(int i) {
		return child.get(i);
	}

	@Override
	public void opration() {
		System.out.println(this+"  Composite to do something");
		Iterator<Component> iterator = child.iterator();
		while(iterator.hasNext()) {
			Component component = iterator.next();
			component.opration();
		}

	}

}

Leaf节点(叶子节点)

java 复制代码
package xyz.jangle.design.composite;

public class Leaf implements Component {

	@Override
	public void add(Component component) {

	}

	@Override
	public void remove(Component component) {

	}

	@Override
	public Component getChild(int i) {
		return null;
	}

	@Override
	public void opration() {
		System.out.println(this + "  Leaf to do something");

	}

}

客户端(使用)

java 复制代码
package xyz.jangle.design.composite;

public class AppMain18 {

	public static void main(String[] args) {
		
		Composite firstNode = new Composite();
		Leaf leaf1 = new Leaf();
		Leaf leaf2 = new Leaf();
		Composite childNode = new Composite();
		Leaf childLeaf1 = new Leaf();
		Leaf childLeaf2 = new Leaf();
		
		firstNode.add(leaf1);
		firstNode.add(leaf2);
		firstNode.add(childNode);
		childNode.add(childLeaf1);
		childNode.add(childLeaf2);
		
		firstNode.opration();
		System.out.println("-------------");
		childNode.opration();
	}

}

输出结果

bash 复制代码
xyz.jangle.design.composite.Composite@659e0bfd  Composite to do something
xyz.jangle.design.composite.Leaf@2a139a55  Leaf to do something
xyz.jangle.design.composite.Leaf@15db9742  Leaf to do something
xyz.jangle.design.composite.Composite@6d06d69c  Composite to do something
xyz.jangle.design.composite.Leaf@7852e922  Leaf to do something
xyz.jangle.design.composite.Leaf@4e25154f  Leaf to do something
-------------
xyz.jangle.design.composite.Composite@6d06d69c  Composite to do something
xyz.jangle.design.composite.Leaf@7852e922  Leaf to do something
xyz.jangle.design.composite.Leaf@4e25154f  Leaf to do something
相关推荐
Zane19943 天前
一个 new 就能创建对象,为什么还要拆出单例、工厂、建造者、原型四种模式?
设计模式
怕浪猫4 天前
一行命令复刻爆款视频,我把 Hypit 从安装跑到了出片
人工智能·设计模式·程序员
Zane19944 天前
函数式编程里的函数,其实不是你天天写的那个函数——三大编程范式的边界在哪
设计模式
Zane19945 天前
策略模式现在该不该上?一次讲清楚过度设计和设计不足怎么找平衡
设计模式
她说..5 天前
常见设计模式-模板方法模式
java·spring·设计模式·springboot
xiaofeiyang1505 天前
第六章 · 桥接 — 三支毛笔,画出九种颜色
设计模式
Shadow(⊙o⊙)6 天前
OTOL设计模式 One Thread One Loop
服务器·网络·设计模式
sarasuki6 天前
如何让LLM 能在半夜偷偷打开网易云呢?
人工智能·设计模式·agent
小王师傅667 天前
【设计模式】装饰模式(四):框架源码实战——从 Java I/O 到 Spring 到 MyBatis
java·设计模式
执明wa7 天前
Android RecyclerView 多类型, 多种 Item
android·xml·开发语言·设计模式·android studio