物件導向設計模式-裝飾者模式(Decorator Pattern)

此篇介紹OOP Design Pattern-裝飾者模式(Decorator Pattern),看完定義後好像似懂非懂,希望在用實際情境以及範例的加持,可以領略其中奧秘,JC日記一邊實作一邊紀錄留下足跡。

繼上一篇觀察者模式-Observer Pattern了解出版/訂閱的概念,這篇介紹裝飾者模式。

 

設計模式-裝飾者模式(Decorator Pattern)

定義:裝飾者模式以對客戶透明的方式動態地給一個對象附加上更多的責任,裝飾者模式生成子類可以更靈活地增加功能。

以我的理解就是買車的概念,假設我們買了一台車,發現配備有點差想要加裝ACC 主動車距維持定速、AEB 自動緊急煞停、BSW 盲點偵測警示,此時就可以套用裝飾者模式,主體對象為車,附加對象則是加裝配備。

//被裝飾者
public abstract class Car
{
    protected string description = "";
    public virtual string getDescription()
    {
        return description;
    }
    //價格
    public abstract int Price();
}
public class TCross : Car
{
    public TCross()
    {
        description = "T-Cross";
    }
    public override int Price()
    {
        return 800000;
    }
}

 

//裝飾者
public abstract class AdditionDecorator : Car
{
    public abstract override string getDescription();
}
public class ACC : AdditionDecorator
{
    private Car car = null;
    public ACC(Car c)
    {
        car = c;
    }
    public override string getDescription()
    {
        return car.getDescription() + "附加ACC";
    }
    public override int Price()
    {
        return car.Price() + 30000;
    }
}
public class AEB : AdditionDecorator
{
    private Car car = null;
    public AEB(Car c)
    {
        car = c;
    }
    public override string getDescription()
    {
        return car.getDescription() + "附加AEB";
    }
    public override int Price()
    {
        return car.Price() + 20000;
    }
}
public class BSW : AdditionDecorator
{
    private Car car = null;
    public BSW(Car c)
    {
        car = c;
    }
    public override string getDescription()
    {
        return car.getDescription() + "附加BSW";
    }
    public override int Price()
    {
        return car.Price() + 10000;
    }
}

 

實作:

//買了一台車 
Car car = new TCross();
Console.WriteLine(car.getDescription());
Console.WriteLine(car.Price().ToString());
//加裝ACC
car = new ACC(car);
Console.WriteLine(car.getDescription());
Console.WriteLine(car.Price().ToString());
//加裝AEB
car = new AEB(car);
Console.WriteLine(car.getDescription());
Console.WriteLine(car.Price().ToString());
//加裝BSW
car = new BSW(car);
Console.WriteLine(car.getDescription());
Console.WriteLine(car.Price().ToString());

 

結果:

 

 

有任何問題可在下方留言讓我知道。

謝謝

 

下一篇工廠模式-Factory Pattern。

 

參考資料

書籍:Head First Design Patterns-深入淺出 設計模式。