设计模式之组合服务

本文介绍了一种称为组合服务的设计模式,该模式适用于处理多层次的数据结构,例如文件系统中的文件和文件夹。通过将整体和个体操作抽象成一个顶层接口或抽象类,并根据不同规则实现具体子类,可以有效地解决复杂层次调用的问题。
摘要由CSDN通过智能技术生成

什么是组合服务

组合服务指的是一个整体和个体操作的共同属性放在一个顶层接口或抽象类中,整体和个体作为这个类的子类根据不同的规则进行不同的实现。

组合服务的使用

组合服务常用的场景有一个文件目录可能存在文件和文件夹,而文件下下面又有文件和文件夹,这种情况为了解决类似List<List>这种多层次调用的问题可以将文件和文件夹抽象为一个目录,抽象方法如下:

public abstract class Directory {
    protected String name;

    public Directory(String name) {
        this.name = name;
    }

    public abstract void show();
}

此时可以将文件和文件夹分别继承这个抽象类,分别实现其中的方法达到不同的展示目的。

public class File extends Directory{
    public File(String name) {
        super(name);
    }

    @Override
    public void show() {
        System.out.println(this.name);
    }
}

public class Folder extends Directory{

    private List<Directory> dirs;
    private Integer level;

    public Folder(String name,Integer level) {
        super(name);
        this.level = level;
        this.dirs = new ArrayList<Directory>();
    }

    @Override
    public void show() {
        System.out.println(this.name);
        for (Directory directory:dirs){
            if (this.level!=null){
                for (int i = 0; i < this.level; i++) {
                    System.out.print("   ");
                }
                for (int i = 0; i < this.level; i++) {
                    if (i==0){
                        System.out.print("+");
                    }
                    System.out.print("-");
                }
                directory.show();
            }
        }
    }

    public boolean add(Directory dir){
        return this.dirs.add(dir);
    }

    public boolean remove(Directory dir){
        return this.dirs.remove(dir);
    }

    public Directory get(int index){
        return this.dirs.get(index);
    }

    public void list(){
        for (Directory dir:dirs) {
            System.out.println(dir.name);
        }
    }

}

通过实现不同的show方法达到展示的目的。
测试上面代码的案例。

public class Test {
    public static void main(String[] args) {
        System.out.println("==========组合模式===========");

        File word = new File("Word.exe");
        File excel = new File("Excel.exe");
        File ppt = new File("PowerPoint.exe");
        Folder office = new Folder("办公软件",2);
        office.add(word);
        office.add(excel);
        office.add(ppt);

        File qq = new File("QQ.exe");
        File wx = new File("微信.exe");
        Folder root = new Folder("D盘",1);
        root.add(qq);
        root.add(wx);
        root.add(office);
        System.out.println("==========show()===========");
        root.show();
        System.out.println("==========list()===========");
        root.list();
    }
}

输出结果

==========show()===========
D盘
   +-QQ.exe
   +-微信.exe
   +-办公软件
      +--Word.exe
      +--Excel.exe
      +--PowerPoint.exe
==========list()===========
QQ.exe
微信.exe
办公软件

组合模式使用场景

类似于一个树形结构,跟节点或者叶子结点都有相同的跟节点,可以将跟节点和叶子结点的相同属性抽离出来作为一个抽象类,跟节点和叶子结点分别继承相同的抽象类,分别实现不同的方法,这种情况下可以用组合模式来实现。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值