Fascade, name being an analogy to an architectural fascade, intends set the tone for the entire functionality by providing a simplified yet effective interface wrapping away the complex, pooly designed collection of APIs.
Wrong Code
Consider following set of Classes.
public class User : IUser
{
int _uInstance;
private bool _IsRunning = false;
public User(int UserID) => _uInstance = UserID;
public void StartRunning()
{
Console.WriteLine($"User {_uInstance} Running");
_IsRunning = true;
}
public void StopRunning(int UserID) => _IsRunning = false;
}
public class GPSTracking : IGPSTracking
{
public void Start() => Console.WriteLine($"GPS started");
public void Stop() { }
public void InitiatizeGPSTracker() { }
public void TroubleShoot() { }
}
public class MusicPlayer : IMusicPlayer
{
public void Start(string AlbumName,string Song) => Console.WriteLine($"Music Player - Song {Song} , Album {AlbumName}");
public void Stop() { }
public void SearchAlbum(string Song) { }
public bool Loop { get; set; }
public void Next() { }
public void Previous() { }
}
The Client Code could be
IUser userInstance = new User(1);
userInstance.StartRunning();
IGPSTracking gpsInstance = new GPSTracking();
gpsInstance.Start();
IMusicPlayer mplayerInstance = new MusicPlayer();
mplayerInstance.Start("MyAlbum","MySong");
As you can see, the Client class is invoking 3 APIs separately and the code look a mess.
Fascade In Action
Idea behind Fascade is to provide a simplified interface. Let’s introduce a Fascade Class now.
class FascadeClass
{
IUser _uInstance;
IGPSTracking _gInstance;
IMusicPlayer _mInstance;
string _Song;
string _album;
public FascadeClass(IUser uInstance,IGPSTracking gInstance, IMusicPlayer mInstance)
{
_uInstance = uInstance;
_gInstance = gInstance;
_mInstance = mInstance;
}
public void SetSong(string Album, string Song) { _Song = Song; _album = Album; }
public void StartRunning()
{
_uInstance.StartRunning();
_gInstance.Start();
_mInstance.Start(_album, _Song);
}
public void StopRunning() { }
}
The Client Code would be now much cleaner as we have wrapped the complexity of IUser, IGPSTracking and IMusicPlayer within the Fascade Class.
FascadeClass fInstance = new FascadeClass(new User(1), new GPSTracking(), new MusicPlayer());
fInstance.SetSong("MyAlbum", "MySong");
fInstance.StartRunning();
Code samples can be found here. Complete list of Patterns and Principles could be found here.
2 thoughts on “Design Patterns : Fascade Pattern”