CODESAMPLE

Facade - C#

Share on:

The Facade pattern provides a simplified interface to a complex subsystem. It encapsulates multiple interactions within the subsystem into a single, higher-level interface, hiding the complexity from the client. This example demonstrates a media player facade, simplifying operations like playing music, video, and managing the audio/video components. The code uses C#’s class-based OOP approach to define the facade and the subsystem components. It’s idiomatic C# due to its clear class structure, property usage, and method naming conventions, promoting encapsulation and ease of use.

// Subsystem classes
public class AudioEngine
{
    public void Play(string fileName) => Console.WriteLine($"Audio: Playing {fileName}");
    public void Stop() => Console.WriteLine("Audio: Stopped");
}

public class VideoEngine
{
    public void Play(string fileName) => Console.WriteLine($"Video: Playing {fileName}");
    public void Stop() => Console.WriteLine("Video: Stopped");
}

// Facade class
public class MediaFacade
{
    private readonly AudioEngine _audioEngine = new();
    private readonly VideoEngine _videoEngine = new();

    public void PlayMedia(string fileName, MediaType type)
    {
        Console.WriteLine($"MediaFacade: Playing {fileName} ({type})");

        switch (type)
        {
            case MediaType.Audio:
                _audioEngine.Play(fileName);
                break;
            case MediaType.Video:
                _videoEngine.Play(fileName);
                break;
            default:
                Console.WriteLine("MediaFacade: Unsupported media type.");
                break;
        }
    }

    public void StopMedia()
    {
        Console.WriteLine("MediaFacade: Stopping media");
        _audioEngine.Stop();
        _videoEngine.Stop();
    }
}

// Enum for media types
public enum MediaType
{
    Audio,
    Video
}

// Client code
public class Client
{
    public static void Main(string[] args)
    {
        MediaFacade facade = new();

        facade.PlayMedia("song.mp3", MediaType.Audio);
        facade.PlayMedia("movie.mp4", MediaType.Video);
        facade.StopMedia();
    }
}