[Design-Pattern] Decorator Pattern
Decorator Pattern - 裝飾模型
Decorator Pattern 也可以稱作 Wrapper Patter。
優點
1. 動態新增功能至已存在的類別
2. 另一種子類別(抽象類別)
3. 支援開閉原則
何時去使用
1. 大型系統(Legacy System)
2. 控制項(Controller)
3. Sealed Class
介面
public interface ICar
{
double GetCost();
string GetName();
}
被裝飾者類別 (Component)
public class Car:ICar
{
public double GetCost()
{
return 600000;
}
public string GetName()
{
return "Car";
}
}
抽象類別
public abstract class DecoratorAccessoryCar : ICar
{
private readonly ICar _car;
public DecoratorAccessoryCar(ICar car)
{
this._car = car;
}
public virtual double GetCost()
{
return this._car.GetCost();
}
public virtual string GetName()
{
return this._car.GetName();
}
}
裝飾類別 (Decorator)
public class BasicAccessories : DecoratorAccessoryCar
{
public BasicAccessories(ICar car) : base(car)
{
}
public override double GetCost()
{
return base.GetCost() + 20000;
}
public override string GetName()
{
return "basic package, " + base.GetName();
}
}
public class AdvanceAccessories : DecoratorAccessoryCar
{
public AdvanceAccessories(ICar car) : base(car)
{
}
public override string GetName()
{
return "Advance Package, " + base.GetName();
}
public override double GetCost()
{
return base.GetCost() + 50000;
}
}
public class SuperAccessories : DecoratorAccessoryCar
{
public SuperAccessories(ICar car) : base(car)
{
}
public override string GetName()
{
return "Super Package, " + base.GetName();
}
public override double GetCost()
{
return base.GetCost() + 100000;
}
}
測試
ICar car = new Car();
Console.WriteLine($"{car.GetName()} , Cost : {car.GetCost()}");
var bcar = new BasicAccessories(car);
Console.WriteLine($"{bcar.GetName()} , Cost : {bcar.GetCost()}");
var acar = new AdvanceAccessories(bcar);
Console.WriteLine($"{acar.GetName()} , Cost : {acar.GetCost()}");
var scar = new SuperAccessories(acar);
Console.WriteLine($"{scar.GetName()} , Cost : {scar.GetCost()}");
Console.ReadLine();
留言
張貼留言