原创

设计模式之组合模式

作者:cndz 围观群众:613 更新于 标签:设计模式组合模式组合模式讲解

组合模式是一种结构型设计模式,它允许你将对象组合成树形结构来表现部分-整体的层次结构。组合能让客户端以一致的方式处理个别对象以及对象组合。

概念

组合模式由多个对象组合成树形结构,以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。优缺点

优点

  1. 组合模式使得新增类型的组件变得十分容易。由于组件数量没有限制,因此可以轻松地增加新的组件。
  2. 对于大部分组合模式的应用场景,在使用组合模式之后,客户端的代码不会发生任何变化,符合开闭原则。
  3. 组合模式可以清楚地定义分层次的复杂对象,表示对象的全部或部分层次。
  4. 组合模式提供了遍历树形结构的灵活性,可以根据需要选择遍历方式。

缺点

  1. 组合模式在使用时可能会造成系统过于庞大,类数量增加。
  2. 组合模式不容易限制组合中的组件类型。

实现方法

组合模式的实现方法有以下几个步骤:

  1. 定义抽象组件(Component):是组合中对象声明接口,在适当情况下,实现所有类共有接口的默认行为。声明一个接口用于访问和管理Component的子部件。
  2. 定义叶子组件(Leaf):在组合中表示叶子节点对象,叶子节点没有子节点。
  3. 定义容器组件(Composite):定义有子部件的那些部件的行为,存储子部件,在Component接口中实现与子部件有关的操作。
  4. 客户端(Client):通过Component接口操作组合部件的对象。

实例

假设现在需要实现一个文件夹管理系统,要求能够管理文件和文件夹,且可以对文件夹进行递归遍历。这个时候就可以使用组合模式来实现。

// 抽象组件
public interface AbstractFile {
    void add(AbstractFile file);
    void remove(AbstractFile file);
    void getChild(int i);
    void killVirus();
}

// 叶子组件
public class File implements AbstractFile {
    private String name;
    public File(String name) {
        this.name = name;
    }
    @Override
    public void add(AbstractFile file) {
        System.out.println("不支持该方法");
    }
    @Override
    public void remove(AbstractFile file) {
        System.out.println("不支持该方法");
    }
    @Override
    public void getChild(int i) {
        System.out.println("不支持该方法");
    }
    @Override
    public void killVirus() {
        System.out.println("对文件'" + name + "'进行杀毒");
    }
}

// 容器组件
public class Folder implements AbstractFile {
    private String name;
    private List<AbstractFile> fileList = new ArrayList<AbstractFile>();
    public Folder(String name) {
        this.name = name;
    }
    @Override
    public void add(AbstractFile file) {
        fileList.add(file);
    }
    @Override
    public void remove(AbstractFile file) {
        fileList.remove(file);
    }
    @Override
    public void getChild(int i) {
        fileList.get(i);
    }
    @Override
    public void killVirus() {
        System.out.println("对文件夹'" + name + "'进行杀毒");
        for (AbstractFile file : fileList) {
            file.killVirus();
        }
    }
}

// 客户端
public class Client {
    public static void main(String[] args) {
        AbstractFile folder1 = new Folder("folder1");
        AbstractFile folder2 = new Folder("folder2");
        AbstractFile file1 = new File("file1");
        AbstractFile file2 = new File("file2");
        folder1.add(folder2);
        folder1.add(file1);
        folder2.add(file2);
        folder1.killVirus();
    }
}

总结

组合模式是一种树形结构的设计模式,它将对象组合成树形结构以表现“部分-整体”的层次结构,使得客户端以一致的方式处理个别对象以及对象组合。组合模式的优点在于能够灵活地定义分层次的复杂对象、清晰地表示对象的全部或部分层次、提供了遍历树形结构的灵活性。而组合模式的缺点在于可能会造成系统过于庞大,类数量增加,并且不容易限制组合中的组件类型。