public class CloudStream: IStream
public virtual void Write(string data)
Console.WriteLine("Storing " + data);
public class CompressedCloudStream: IStream
private readonly IStream _stream;
public CompressedCloudStream(IStream stream)
public void Write(string data)
var compressed = Compress(data);
_stream.Write(compressed);
private string Compress(string data)
return data.Substring(0, 5);
public class EncryptedCloudStream: IStream
public EncryptedCloudStream(IStream stream)
public void Write(string data)
var encrypted = Encrypt(data);
_stream.Write(encrypted);
private string Encrypt(string data)
public static void Main()
var stream = new EncryptedCloudStream(new CompressedCloudStream(new CloudStream()));
stream.Write("sensitive data");