【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】
知识回顾:
之前我们讲过的设计模式在这里呦:
【面试最常见的设计模式之单例模式】
【面试最常见的设计模式之工厂模式】
【Java中23种面试常考的设计模式之备忘录模式(Memento)—行为型模式】
【Java中23种面试常考的设计模式之观察者模式(Observer)—行为型模式】
【Java中23种面试常考的设计模式之模板模式(Template)—行为型模式】
【Java中23种面试常考的设计模式之状态模式(State)—行为型模式】
【Java中23种面试常考的设计模式之策略模式(Strategy)—行为型模式】
【Java中23种面试常考的设计模式之迭代器模式(Iterator)—行为型模式】
【Java中23种面试常考的设计模式之访问者模式(Visitor)—行为型模式】
【Java中23种面试常考的设计模式之中介者模式(Mediator)—行为型模式】
【Java中23种面试常考的设计模式之解释器模式(Interpreter)—行为型模式】
【Java中23种面试常考的设计模式之命令模式(Command)—行为型模式】
【Java中23种面试常考的设计模式之责任链模式(Chain of Responsibility)—行为型模式】
【Java中23种面试常考的设计模式之适配器模式(Adapter)—结构型模式】
【Java中23种面试常考的设计模式之桥接模式(Bridge)—结构型模式】
接下来我们要进行学习的是:【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】。
组合模式
组合模式:将对象组合成树形结构以表示"部分-整体"的层次结构,从而使客户端可以使用统一的方式处理部分对象和整体对象。
解决的问题
- 它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
- 解决的是表示对象的部分-整体层次结构(树形结构)。
- 树枝和叶子实现统一接口,树枝内部组合该接口。
生产开发中常用的使用场景
- Junit单元测试框架(底层设计就是典型的组合模式,TestCase(叶子)、TestUnite(容器)、Test接口(抽象))
- 操作系统的资源管理器(树形菜单,文件以及文件夹管理)
- GUI中的容器层次图
- XML文件解析
- 等等。。。
模式优点与缺点
优点
- 高层模块调用简单。
- 节点可以自由增加。
缺点
- 在使用组合模式时,其叶子和树枝的声明都是实现类,而不是接口,违反了依赖倒置原则。
核心角色
抽象构件(Component)角色: 定义了叶子和容器构件的共同点
叶子(Leaf)角色:无子节点
容器(Composite)角色:有容器特征,可以包含子节点
Main–Client:测试类
UML类图
实现代码:我们举这样一个栗子
,既然我们的组合模式在处理文件系统上有绝对的优势,那么我们就来实现一个简单的案例(因为我们的文件系统底层就是通过树状结构来实现)
FileComponent 类
package com.composite;
public interface FileComponent {
void operiation();
}
ImageLeaf 类
package com.composite;
public class ImageLeaf implements FileComponent{
private String name;
public ImageLeaf(String name) {
super();
this.name = name;
}
@Override
public void operiation() {
System.out.println("图片文件:"+name+" 处理操作");
}
}
TextLeaf 类
package com.composite;
public class TextLeaf implements FileComponent{
private String name;
public TextLeaf(String name) {
super();
this.name = name;
}
@Override
public void operiation() {
System.out.println("文本文件:"+name+" 处理操作");
}
}
FolderComposite 类
package com.composite;
import java.util.ArrayList;
import java.util.List;
public class FolderComposite implements FileComponent{
private String name;
// 定义容器,用来存储叶子节点 也就是存储文件
private List<FileComponent> list = new ArrayList<>();
public FolderComposite(String name) {
super();
this.name = name;
}
public void add(FileComponent file){
list.add(file);
}
public void remove(FileComponent file){
list.remove(file);
}
public FileComponent getChild(int index){
return list.get(index);
}
@Override
public void operiation() {
System.out.println("处理:"+name+"文件夹");
for (FileComponent file : list) {
file.operiation();
}
}
}
客户端测试代码Client-Main
package com.composite;
public class Main {
public static void main(String[] args) {
FileComponent text= new TextLeaf("硕风和炜.txt");
FileComponent image = new ImageLeaf("硕风和炜.jpg");
FolderComposite composite = new FolderComposite("D:/硕风和炜");
composite.add(text);
composite.add(image);
composite.operiation();
}
}
运行结果展示:
好了,到这里【Java中23种面试常考的设计模式之组合模式(Composite)—结构型模式】就结束了,23种设计模式持续更新汇总中。