网站首页 > java教程 正文
组合模式
定义:将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。
组合模式是将对象组合成树状结构,其中树的节点可以是单个对象或对象组合。这样,无论是操作单个对象还是对象组合,都可以使用统一的方式进行操作。组合模式通过定义一个共同的抽象类或接口来表示单个对象和对象组合,从而实现了透明的处理。
特点
优点:
- 组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;
- 更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;
缺点:
- 设计较复杂,客户端需要花更多时间理清类之间的层次关系;
- 不容易限制容器中的构件;
- 不容易用继承的方法来增加构件的新功能;
结构与实现
主要构件如下:
- 抽象构件:它的主要作用是为树叶构件和树枝构件声明公共接口,并实现它们的默认行为。
- 叶构件:是组合中的叶节点对象,它没有子节点,用于实现抽象构件角色中 声明的公共接口。
- 树枝构件:是组合中的分支节点对象,它有子节点。它实现了抽象构件角色中声明的接口,主要作用是存储和管理子部件,通常包含 Add()、Remove()、GetChild() 等方法。
类图如下:
示例代码如下:
Component.java
public interface Component {
void add(Component c);
void remove(Component c);
Component getChild(int i);
void operation();
}
Leaf.java
private String name;
public Leaf(String name) {
this.name = name;
}
@Override
public void add(Component c) {
}
@Override
public void remove(Component c) {
}
@Override
public Component getChild(int i) {
return null;
}
@Override
public void operation() {
System.out.println(MessageFormat.format("树叶[{0}]业务代码执行", name));
}
}
Composite.java
public class Composite implements Component {
private List<Component> childeren;
public Composite() {
this.childeren = new ArrayList<Component>();
}
@Override
public void add(Component c) {
childeren.add(c);
}
@Override
public void remove(Component c) {
childeren.remove(c);
}
@Override
public Component getChild(int i) {
return childeren.get(i);
}
@Override
public void operation() {
childeren.forEach(item -> item.operation());
}
}
CompositeTest.java
public class CompositeTest {
public static void main(String[] args) {
Composite composite = new Composite();
Component leafa = new Leaf("A");
Component leafb = new Leaf("B");
Component leafc = new Leaf("C");
composite.add(leafa);
composite.add(leafb);
composite.add(leafc);
composite.operation();
}
}
应用场景
在需要表示一个对象整体与部分的层次结构的场合。要求对用户隐藏组合对象与单个对象的不同,用户可以用统一的接口使用组合结构中的所有对象的场合。
将组合模式中的树叶节点和树枝节点进行抽象,也就是说树叶节点和树枝节点还有子节点,这时组合模式就扩展成复杂的组合模式。如 JavaAWT、Swing中就有大量的应用
猜你喜欢
- 2025-07-28 六种java的多线程设计模式详解和代码举例
- 2025-07-28 Java设计模式(java设计模式刘伟课后答案)
- 2025-07-28 Java设计模式之装饰模式(java装饰模式和代理模式)
- 2025-07-28 Java设计模式之模板方法模式(java怎么写模板类)
- 2025-07-28 Java设计模式之外观模式(外观模式 java)
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)