public abstract class ShoppingCartBase
private string customerEmail;
private decimal orderTotal;
protected string GetUserEmail()
return this.customerEmail;
protected decimal CalculateTotal()
public void Checkout(string customerEmail, decimal orderTotal)
this.customerEmail = customerEmail;
this.orderTotal = orderTotal;
public interface IPaymentProcessor
bool PayOnline(decimal totalAmount);
public class PaymentProcessor : IPaymentProcessor
private Random random = new Random();
public bool PayOnline(decimal totalAmount)
var randomNumber = random.Next(1, 100);
var paymentSucceeds = randomNumber % 2 == 0;
var paymentMessage = paymentSucceeds ? "succeeded" : "failed";
Console.WriteLine($"Payment processor: payment of {totalAmount} {paymentMessage}");
public interface IEmailServer
void SendEmail(string to, string message);
public class EmailServer : IEmailServer
public void SendEmail(string to, string message)
Console.WriteLine($"Email server: sending email to '{to}' with message: {message}");
public class ShoppingCart : ShoppingCartBase
private readonly IPaymentProcessor paymentProcessor;
private readonly IEmailServer emailServer;
public ShoppingCart(IPaymentProcessor paymentProcessor, IEmailServer emailServer)
this.paymentProcessor = paymentProcessor;
this.emailServer = emailServer;
var orderTotal = CalculateTotal();
var paymentSucceeded = this.paymentProcessor.PayOnline(orderTotal);
this.emailServer.SendEmail(GetUserEmail(), paymentSucceeded ? "order succesfully placed" : "online payment failed, your order wasn't placed");
public static void Main()
var paymentProcessor = new PaymentProcessor();
var emailServer = new EmailServer();
var shoppingCart = new ShoppingCart(paymentProcessor, emailServer);
shoppingCart.Checkout("user@gmail.com", 200);
shoppingCart.PlaceOrder();