亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#裝飾器模式(Decorator Pattern)實(shí)例教程

 更新時(shí)間:2014年09月12日 15:47:21   投稿:shichen2014  
這篇文章主要介紹了C#裝飾器模式(Decorator Pattern),以一個(gè)完整實(shí)例形式講述了C#裝飾器模式的實(shí)現(xiàn)過程,有助于深入理解C#程序設(shè)計(jì)思想,需要的朋友可以參考下

本文以實(shí)例形式詳細(xì)講述了C#裝飾器模式的實(shí)現(xiàn)方法。分享給大家供大家參考。具體實(shí)現(xiàn)方法如下:

現(xiàn)假設(shè)有一個(gè)公司要做產(chǎn)品套餐,即把不同的產(chǎn)品組合在一起,不同的組合對(duì)應(yīng)不同的價(jià)格。最終呈現(xiàn)出來的效果是:把產(chǎn)品組合的所有元素呈現(xiàn)出來,并顯示該組合的價(jià)格。

每個(gè)產(chǎn)品都有名稱和價(jià)格,首先設(shè)計(jì)一個(gè)關(guān)于產(chǎn)品的抽象基類。

public abstract class ProductBase
{
    public abstract string GetName();
    public abstract double GetPrice();
}

所有的產(chǎn)品都必須繼承這個(gè)基類,比如家居用品、電器產(chǎn)品等,把這些具體的產(chǎn)品提煉成一個(gè)繼承ProductBase的子類。

public class ConcretProuct : ProductBase
{
    private string _name;
    private double _price;
    public ConcretProuct(string name, double price)
    {
      this._name = name;
      this._price = price;
    }
    public override string GetName()
    {
      return _name;
    }
    public override double GetPrice()
    {
      return _price;
    }
}

然后考慮產(chǎn)品組合。比如賣平底鍋,可能送醬油,也有可能送醬油+老壇酸菜,可能的組合包括:

1. 平底鍋
2. 平底鍋 + 醬油
3. 平底鍋 + 醬油 + 老壇酸菜  

在這里,可以把醬油,老壇酸菜看作是裝飾器,因?yàn)槊考右粋€(gè)產(chǎn)品,都是在原有的基礎(chǔ)上增加的。比如做"平底鍋 + 醬油"這個(gè)組合,是在"平底鍋"的基礎(chǔ)上增加了"醬油"。

現(xiàn)在把醬油、老壇酸菜也設(shè)計(jì)成繼承ProductBase的子類,也就是裝飾器類。不過,與ConcretProuct類不同的是,裝飾器類需要引用ProductBase,在這里,無論是顯示產(chǎn)品組合還是計(jì)算產(chǎn)品產(chǎn)品組合價(jià)格,都離不開這個(gè)引用的ProductBase。

public class Decorator : ProductBase
{
    private ProductBase _product = null;
    private string _name;
    private double _price;
    public Decorator(ProductBase product, string name, double price)
    {
      this._product = product;
      this._name = name;
      this._price = price;
    }
    public override string GetName()
    {
      return string.Format("{0},{1}", _product.GetName(), _name);
    }
    public override double GetPrice()
    {
      return _product.GetPrice() + _price;
    }
}

以上,顯示產(chǎn)品名稱的時(shí)候,把裝飾器類Decorator引用的ProductBase的名稱和當(dāng)前名稱組合起來,以逗號(hào)分隔;顯示產(chǎn)品價(jià)格的時(shí)候,把引用的ProductBase的價(jià)格和當(dāng)前價(jià)格相加。

客戶端如下:

class Program
{
    static void Main(string[] args)
    {
      ConcretProuct livingProduct = new ConcretProuct("平底鍋",100);
      Console.WriteLine(PrintProductDetails(livingProduct));
      Decorator dec1 = new Decorator(livingProduct,"海鮮醬油",10);
      Console.WriteLine(PrintProductDetails(dec1));
      Decorator dec2 = new Decorator(dec1, "老壇酸菜",12);
      Console.WriteLine(PrintProductDetails(dec2));
      Console.ReadKey();
    }
    private static string PrintProductDetails(ProductBase product)
    {
      return string.Format("產(chǎn)品組合:{0}   價(jià)格:{1}", product.GetName(), product.GetPrice());
    }
}

運(yùn)行結(jié)果如下圖所示:

希望本文所述對(duì)大家C#程序設(shè)計(jì)的學(xué)習(xí)有所幫助。

相關(guān)文章

最新評(píng)論