设计模式-组合模式
组合模式(Composite Pattern)
组合模式:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。
组合模式结构:

组合部件(Component):它是一个抽象角色,为要组合的对象提供统一的接口。
叶子(Leaf):在组合中表示子节点对象,叶子节点不能有子节点。
合成部件(Composite):定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。
客户端(Client):使用 Component 部件的对象。
代码:
//Component:它是一个抽象角色,为要组合的对象提供统一的接口。
public abstract class Component{
public abstract void operation();
//集成该抽象类,叶子节点不能拥有的方法如果调用抛出异常
//枝节点需要,重写这些方法
public void add(Component component) {throw new UnsupportedOperationException();}
public void remove(Component component) {throw new UnsupportedOperationException();}
public Component getChild(int i) {throw new UnsupportedOperationException();}
}
//Leaf:组合中表示子节点对象,叶子节点不能有子节点。
class ConcreteComponent1 extends Component {
public void operation() {System.out.println("叶节点1 ");}
}
class ConcreteComponent2 extends Component {
public void operation() {System.out.println("叶节点2");}
}
class ConcreteComponent3 extends Component {
public void operation() {System.out.println("叶节点3");}
}
//Composite:定义有枝节点的行为,用来存储部件,实现在Component接口中的有关操作,如增加(Add)和删除(Remove)。
public class Composite extends Component{
//保存子节点
private ArrayList<Component> children;
public Composite() {
//初始化
children = new ArrayList<Component>();
}
//遍历调用所有子节点方法
public void operation() {
for(Component child: children) {
child.operation();
}
}
//添加子节点
@Override
public void add(Component c) {children.add(c);}
//移除子节点
@Override
public void remove(Component c) {children.remove(c);}
//获取子节点
@Override
public Component getChild(int i) {return children.get(i);}
}
//Client:使用 Component 部件的对象。
public class Client{
public static void main(String[] args){
// 生成树根,并为其增加两个叶子节点
Composite root = new Composite();
root.add(new ConcreteComponent1());
root.add(new ConcreteComponent2());
//创建一个枝节点
Composite branch = new Composite();
// 为branch增加叶节点
branch.add(new ConcreteComponent3());
// 为根增加个枝节点
root.add(branch);
// 遍历整棵树
root.operation();
}
}
优点:
1、使客户端调用简单,客户端可以一致的使用组合结构或其中单个对象,用户就不必关系自己处理的是单个对象还是整个组合结构,这就简化了客户端代码。
2、更容易在组合体内加入对象部件. 客户端不必因为加入了新的对象部件而更改代码。
缺点:
1、组合模式不容易限制组合中的构件。
应用场景:
1、部分、整体场景,如树形菜单,文件、文件夹的管理。

浙公网安备 33010602011771号