设计模式-组合模式

组合模式(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、部分、整体场景,如树形菜单,文件、文件夹的管理。

 

posted @ 2020-06-07 18:39  梦里前进  阅读(163)  评论(0编辑  收藏  举报