オブジェクトを動的に装飾するパターン
/// <summary>
/// Decoratorパターンのサンプルコード
/// </summary>
interface IProduct
{
string Name {get;}
int Price{get;}
}
class Coffee : IProduct
{
public string Name {get;}
public int Price {get;}
public Coffee(string name, int price)
{
Name = name;
Price = price;
}
}
class Tax : IProduct
{
IProduct _product;
public string Name
{
get
{
return $"{_product.Name} With Tax";
}
}
public int Price
{
get
{
return (int)(_product.Price * 1.1);
}
}
public Tax(IProduct product)
{
_product = product;
}
}
class Gratuity : IProduct
{
IProduct _product;
public string Name
{
get
{
return $"{_product.Name} ,Gratuity";
}
}
public int Price
{
get
{
return (int)(_product.Price * 1.3);
}
}
public Gratuity(IProduct product)
{
_product = product;
}
}
static class Program
{
static public void Main()
{
IProduct coffee = new Coffee("Coffee", 300);
IProduct kanCoffee = new Tax(coffee);
IProduct caffeCoffee = new Gratuity(kanCoffee);
Console.WriteLine($"{coffee.Name}: {coffee.Price}");
// Coffee: 300
Console.WriteLine($"{kanCoffee.Name}: {kanCoffee.Price}");
// Coffee With Tax: 330
Console.WriteLine($"{caffeCoffee.Name}: {caffeCoffee.Price}");
// Coffee With Tax ,Gratuity: 429
}
}
コメント