using System.Collections.Generic;
List<IMailServer> mServers = new()
new FilterDecorator("diamonds",
new FilterDecorator("free",
new FilterDecorator("illegal",
new FilterDecorator("banned",
new FilterDecorator("contraband",
new FilterDecorator("free",
new CensorDecorator("illegal",
new CensorDecorator("banned",
new FilterDecorator("contraband",
new FilterDecorator("diamonds",
new CensorDecorator("dolor",
ms.SendMessage("message1, Lorem ipsum dolor sit amet, oris nisi ut aliquip ex ea commodo consequat.");
ms.SendMessage("message2, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunta aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. contraband click here");
ms.SendMessage("message3, Lorem ctetur adipiscing elit, sed incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. block banned this words are unwelcome here illegal");
ms.SendMessage("message4, Lorem ipsum dolor sit amet, consectetur adiam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. block free this words are unwelcome here");
ms.SendMessage("message5, Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed diamonds do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nos illegal words are unwelcome here");
Console.WriteLine(ms.ReceiveMessage());
Console.WriteLine(ms.ReceiveMessage());
Console.WriteLine(ms.ReceiveMessage());
Console.WriteLine(ms.ReceiveMessage());
Console.WriteLine(ms.ReceiveMessage());
string? ReceiveMessage();
void SendMessage(string message);
class MailServer : IMailServer
private readonly Queue<string> messageQueue;
this.messageQueue = new();
public string? ReceiveMessage()
msg = this.messageQueue.Dequeue();
catch (System.InvalidOperationException)
Console.WriteLine("The queue is empty. Add new messages using SendMessage() method.");
public void SendMessage(string message)
this.messageQueue.Enqueue(message);
abstract class Decorator : IMailServer
protected IMailServer mailServer;
public Decorator(IMailServer mailServer)
this.mailServer = mailServer;
public virtual string? ReceiveMessage()
return mailServer.ReceiveMessage();
public virtual void SendMessage(string message)
mailServer.SendMessage(message);
class SentDecorator : Decorator
public SentDecorator(IMailServer mailServer) : base(mailServer) { }
public override string? ReceiveMessage()
return base.ReceiveMessage();
public override void SendMessage(string message)
base.SendMessage($"{message}\nSENT: {DateTime.Now}");
class ReceivedDecorator : Decorator
public ReceivedDecorator(IMailServer mailServer) : base(mailServer) { }
public override string? ReceiveMessage()
string? msg = base.ReceiveMessage();
if (!string.IsNullOrEmpty(msg))
msg += $"\nRECEIVED: {DateTime.Now}";
public override void SendMessage(string message)
base.SendMessage(message);
class NumberDecorator : Decorator
private int msgIndex = 0;
public NumberDecorator(IMailServer mailServer) : base(mailServer) { }
public override string? ReceiveMessage()
return base.ReceiveMessage();
public override void SendMessage(string message)
base.SendMessage($"{message}\nMESSAGE NUMBER: {this.msgIndex}");
class FilterDecorator : Decorator
private readonly string filter;
public FilterDecorator(string filter, IMailServer mailServer) : base(mailServer)
public override string? ReceiveMessage()
string? msg = base.ReceiveMessage();
if (msg != null && msg.Contains(this.filter))
Console.WriteLine($"\nMessage contained bad word \"{this.filter}\" and hasn't been delivered.");
public override void SendMessage(string message)
base.SendMessage(message);
class CensorDecorator : Decorator
private readonly string censor;
public CensorDecorator(string censor, IMailServer mailServer) : base(mailServer)
public override string? ReceiveMessage()
return base.ReceiveMessage();
public override void SendMessage(string message)
base.SendMessage(message.Replace(censor, "***"));
class CipherDecorator : Decorator
public CipherDecorator(IMailServer mailServer) : base(mailServer) { }
public override string? ReceiveMessage()
string? msg = base.ReceiveMessage();
if (!string.IsNullOrEmpty(msg))
byte[] base64EncodedBytes = Convert.FromBase64String(msg);
msg = Encoding.UTF8.GetString(base64EncodedBytes);
public override void SendMessage(string message)
byte[] plainTextBytes = Encoding.UTF8.GetBytes(message);
string msg = Convert.ToBase64String(plainTextBytes);