组合模式

定义:有时又叫作部分-整体模式,它是一种将对象组合成树状的层次结构的模式,用来表示“部分-整体”的关系,使用户对单个对象和组合对象具有一致的访问性。

意图:将对象组合成树形结构以表示"部分-整体"的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以向处理简单元素一样来处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。

何时使用: 1、您想表示对象的部分-整体层次结构(树形结构)。 2、您希望用户忽略组合对象与单个对象的不同,用户将统一地使用组合结构中的所有对象。

组合模式的主要优点有:

组合模式使得客户端代码可以一致地处理单个对象和组合对象,无须关心自己处理的是单个对象,还是组合对象,这简化了客户端代码;

更容易在组合体内加入新的对象,客户端不会因为加入了新的对象而更改源代码,满足“开闭原则”;

其主要缺点是:

设计较复杂,客户端需要花更多时间理清类之间的层次关系;

不容易限制容器中的构件;

不容易用继承的方法来增加构件的新功能;

举例(访问一颗树),类图如下:

 

 1 组件

public interface Component {
    public void add(Component c);
    public void remove(Component c);
    public Component getChild(int i);
    public void operation();
 
}

2 叶子

public class Leaf implements Component{
    
    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) {
        // TODO Auto-generated method stub
        return null;
    }
 
    @Override
    public void operation() {
        // TODO Auto-generated method stub
         System.out.println("树叶"+name+":被访问!"); 
    }
 
}

3 树枝

public class Composite implements Component {
 
    private ArrayList<Component> children = new ArrayList<Component>();
 
    public void add(Component c) {
        children.add(c);
    }
 
    public void remove(Component c) {
        children.remove(c);
    }
 
    public Component getChild(int i) {
        return children.get(i);
    }
 
    public void operation() {
        for (Object obj : children) {
            ((Component) obj).operation();
        }
    }
}

 

posted on 2021-10-21 10:35  季昂  阅读(57)  评论(0编辑  收藏  举报