Pattern: CompositeProvider

Description

Composite Provider pattern is a structural design pattern that lets you compose objects into tree structures to represent part-whole hierarchies.
Composite lets clients treat individual objects and compositions of objects uniformly.

Example in .NET :

CompositeProvider

  

using Microsoft.Extensions.FileProviders;

namespace CompositeProvider;
public class CompositeProviderDemo
{
    private readonly IFileProvider _fileProvider;
    public CompositeProviderDemo(string folder)
    {
        var fileOnHDDProvider = new PhysicalFileProvider(folder);
        var manifestEmbeddedProvider =
    new ManifestEmbeddedFileProvider(this.GetType().Assembly);
        _fileProvider = new CompositeFileProvider(fileOnHDDProvider,manifestEmbeddedProvider);

    }
    public string[] GetFiles()
    {
        List<string> ret = [];
        var files = _fileProvider.GetDirectoryContents(string.Empty);
        var contents = _fileProvider.GetDirectoryContents(string.Empty);
        foreach (var fileInfo in contents)
        {
            ret.Add(fileInfo.Name);
        }
        return ret.ToArray();
    }
    public string GetContentFile(string name)
    {
        var fileInfo = _fileProvider.GetFileInfo(name);
        if (fileInfo.Exists)
        {
            using var stream = fileInfo.CreateReadStream();
            using var reader = new StreamReader(stream);
            return reader.ReadToEnd();
        }
        return string.Empty;
    }

}


And his usage

// See https://aka.ms/new-console-template for more information
using CompositeProvider;

Console.WriteLine("Hello, World!");
var path = Directory.GetParent(Environment.CurrentDirectory);
ArgumentNullException.ThrowIfNull(path);
CompositeProviderDemo compositeProvider = new(path.FullName) ;
Console.WriteLine("Files in the current directory:");
foreach (var file in compositeProvider.GetFiles())
{
    Console.WriteLine(file);
}
Console.WriteLine("obtain MyResource.txt even if does not exists on folder");
Console.WriteLine(compositeProvider.GetContentFile("MyResource.txt"));

Learn More

Source Code for Microsoft implementation of CompositeProvider SourceCode Composite Provider
Learn More File Providers in ASP.NET Core
Wikipedia
}

Homework

Imagine that you have 2 loggers , for a file and a console.
Implement a composite provider that allows you to log to multiple destinations at the same time.