Ejemplos Open/Close
public enum CustomerType {
Regular,
Premium,
Newbie
}
public class DiscountCalculator {
public double CalculateDiscount(double price, CustomerType customerType) {
switch (customerType) {
case Regular:
return price * 0.1; // 10% discount for regular customers
case Premium:
return price * 0.3; // 30% discount for premium customers
case Newbie:
return price * 0.05; // 5% discount for new customers
default:
throw new IllegalArgumentException();
}
}
}
public interface IDiscountStrategy {
double CalculateDiscount(double price);
}
//Implement this interface for each discount type
public class RegularDiscount implements IDiscountStrategy {
public double CalculateDiscount(double price) {
return price * 0.1;
}
}
public class PremiumDiscount implements IDiscountStrategy {
public double CalculateDiscount(double price) {
return price * 0.3;
}
}
public class NewbieDiscount implements IDiscountStrategy {
public double CalculateDiscount(double price) {
return price * 0.05;
}
}
//Modify the DiscountCalculator class to accept an IDiscountStrategy
public class DiscountCalculator {
private final IDiscountStrategy _discountStrategy;
public DiscountCalculator(IDiscountStrategy discountStrategy) {
_discountStrategy = discountStrategy;
}
public double CalculateDiscount(double price) {
return _discountStrategy.CalculateDiscount(price);
}
}
//Testing the Open-Closed Principle
public class Program {
public static void main(String[] args) {
RegularDiscount regularDiscount = new RegularDiscount();
DiscountCalculator calculator = new DiscountCalculator(regularDiscount);
double discountedPrice = calculator.CalculateDiscount(100); // 10% discount applied
PremiumDiscount premiumDiscount = new PremiumDiscount();
calculator = new DiscountCalculator(premiumDiscount);
discountedPrice = calculator.CalculateDiscount(100); // 30% discount applied
}
}
public enum ProductCategory
{
Electronics,
Groceries,
Clothing
}
public class Product
{
public string Name { get; set; }
public double Price { get; set; }
public ProductCategory Category { get; set; }
}
public class TaxCalculator
{
public double CalculateTax(Product product)
{
switch (product.Category)
{
case ProductCategory.Electronics:
return product.Price * 0.15; // 15% tax
case ProductCategory.Groceries:
return product.Price * 0.05; // 5% tax
case ProductCategory.Clothing:
return product.Price * 0.10; // 10% tax
default:
throw new ArgumentException("Unsupported product category");
}
}
}
public enum ProductCategory {
Electronics,
Groceries,
Clothing
}
public class Product {
public String Name;
public double Price;
public ProductCategory Category;
}
//Define an interface for tax calculation
public interface ITaxStrategy {
double CalculateTax(Product product);
}
//Implement this interface for each category
public class ElectronicsTaxStrategy implements ITaxStrategy {
public double CalculateTax(Product product) {
return product.Price * 0.15;
}
}
public class GroceriesTaxStrategy implements ITaxStrategy {
public double CalculateTax(Product product) {
return product.Price * 0.05;
}
}
public class ClothingTaxStrategy implements ITaxStrategy {
public double CalculateTax(Product product) {
return product.Price * 0.10;
}
}
//Refactor the main tax calculator to utilize these strategies
public class TaxCalculator {
private final ITaxStrategy _taxStrategy;
public TaxCalculator(ITaxStrategy taxStrategy) {
_taxStrategy = taxStrategy;
}
public double CalculateTax(Product product) {
return _taxStrategy.CalculateTax(product);
}
}
//Testing the Open-Closed Principle
public class Program {
public static void main(String[] args) {
Product electronicsProduct = new Product();
electronicsProduct.Name = "Laptop";
electronicsProduct.Price = 1000;
electronicsProduct.Category = ProductCategory.Electronics;
ITaxStrategy electronicsTaxStrategy = new ElectronicsTaxStrategy();
TaxCalculator taxCalculator = new TaxCalculator(electronicsTaxStrategy);
System.out.printf("Tax for %s: $%.2f\n", electronicsProduct.Name, taxCalculator.CalculateTax(electronicsProduct));
}
}