Java结构型设计模式-复合模式

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


在这里插入图片描述

1. 复合模式简介

复合设计模式是Java中的一种结构型设计模式,‌它用于表示部分-整体的层次结构。‌当需要创建一种结构,‌其中结构中的对象必须以相同的方式对待时,‌可以使用复合设计模式。‌例如,‌一个图表可以由圆形、‌直线、‌三角形等对象组成,‌当我们用颜色填充图表时,‌相同的颜色也会应用到图表中的各个对象上。‌这里的图表由不同的部分组成,‌并且它们都有相同的操作,‌这就是复合设计模式的典型应用场景。‌

复合设计模式允许用户以一致的方式处理单个对象和对象组合。‌通过定义一个抽象的组件类和一些具体的组件类,‌可以构建复杂的对象结构。‌这些对象可以动态地添加或删除,‌从而实现灵活的组合方式。‌这种模式特别适用于表示部分与整体的关系,‌如文件系统、‌组织结构图、‌UI组件等。‌

2. 复合模式角色

在这里插入图片描述

Java中的复合设计模式包含三个主要角色:‌Component(‌抽象构件)‌、‌Leaf(‌叶子构件)‌和Composite(‌复合构件)‌。‌

2.1 Component(‌抽象构件)‌

这是组合中对象的声明接口,‌它声明了一个接口用于访问和管理Component的子组件。‌在适当的情况下,‌它实现所有类共有的接口的默认行为。‌抽象构件还声明了一个简单方法用于增加(‌add)‌和删除(‌remove)‌子对象,‌并允许客户端访问一个子组件。‌

2.2 Leaf(‌叶子构件)‌

在组合中表示叶子节点对象,‌叶子节点没有子节点。‌在组合模式的结构中,‌叶子节点是组合树的基本对象,‌它不再包含其他的子节点。‌

2.3 Composite(‌复合构件)‌

在组合中表示有子节点的父节点。‌复合对象的作用是存储子部件,‌并且在必要时遍历子部件,‌允许客户端以统一的方式处理叶子对象和复合对象。‌

通过这些角色,‌组合模式提供了一种灵活的方式来处理对象组合的复杂性一致性,‌使得客户端代码可以以统一的方式处理叶子对象和复合对象,‌而无需关心其具体的实现细节。‌

3. 复合模式应用代码示例

看过springboot源码的朋友应该都清楚,经常看到有包含类似Composite词汇的类名,如下图,spring mvc重点Filter,就是一个复合模式的典型应用。
在这里插入图片描述在spring框架中,类似Filter这样的复合设计模式相当多,这里就不列举了!在这里,我将复合设计模式应用于下面绘图场景,一起来看看吧。

3.1 Component(‌抽象构件)‌

复合模式抽象组件定义了叶子和复合模式的通用方法。我们可以创建一个类,Shape使用一个方法draw(String fillColor)来绘制具有给定颜色的形状:Shape.java

public interface Shape {
	
	public void draw(String fillColor);
}

3.2 Leaf(‌叶子构件)‌

复合设计模式 leaf 实现了Component(‌抽象构件)‌,这些是复合的构建块。我们可以创建多个 leaf 对象,例如三角形圆形等:

  1. 三角形Triangle.java
public class Triangle implements Shape {

	@Override
	public void draw(String fillColor) {
		System.out.println("Drawing Triangle with color "+fillColor);
	}
}
  1. 圆形 Circle.java
public class Circle implements Shape {

	@Override
	public void draw(String fillColor) {
		System.out.println("Drawing Circle with color "+fillColor);
	}

}

3.3 Composite(‌复合构件)‌

复合构件包含一组叶子对象,我们应该提供一些辅助方法来从组中添加或删除叶子。我们还可以提供一种方法从组中删除所有元素,见如下:Drawing.java

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

public class Drawing implements Shape{

	//collection of Shapes
	private List<Shape> shapes = new ArrayList<Shape>();
	
	@Override
	public void draw(String fillColor) {
		for(Shape sh : shapes)
		{
			sh.draw(fillColor);
		}
	}
	
	//adding shape to drawing
	public void add(Shape s){
		this.shapes.add(s);
	}
	
	//removing shape from drawing
	public void remove(Shape s){
		shapes.remove(s);
	}
	
	//removing all the shapes
	public void clear(){
		System.out.println("Clearing all the shapes from drawing");
		this.shapes.clear();
	}
}

请注意,composite(上面的Drawing.java类) 也实现了 component,并且行为类似于 leaf,只是它可以包含 leaf 元素组
在这里插入图片描述
我们的复合模式实现已经准备就绪,我们可以用客户端程序对其进行测试。

3.4 复合设计模式客户端测试程序

TestCompositePattern.java

public class TestCompositePattern {

	public static void main(String[] args) {
		Shape tri = new Triangle();
		Shape tri1 = new Triangle();
		Shape cir = new Circle();
		
		Drawing drawing = new Drawing();
		drawing.add(tri1);
		drawing.add(tri1);
		drawing.add(cir);
		
		drawing.draw("Red");
		
		drawing.clear();
		
		drawing.add(tri);
		drawing.add(cir);
		drawing.draw("Green");
	}
}

上述复合模式客户端程序的输出为:

Drawing Triangle with color Red
Drawing Triangle with color Red
Drawing Circle with color Red
Clearing all the shapes from drawing
Drawing Triangle with color Green
Drawing Circle with color Green

4. 总结

以上就是有关Java设计模式之“复合模式”的详细介绍,通过本文,我们了解到复合模式它是java结构型设计模式之一,同时也清楚复合模式包含的三个角色,分别是抽象组件叶子构件复合构件

我们通过展示了Spring Mvc中Filter的代码,清楚知道Filter其实也是采用的复合设计模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码踏云端

你的打赏是我精心创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值