《C#設計模式》【裝飾者模式】

一:案例場景

在軟件開發中,我們經常想要對一類對象添加不同的功能,例如要給房子添加安防,房子暖氣,房子防水等,如果此時利用繼承來實現的話,就需要定義無數的類,如HouseSecuity(安防類)、HouseWarm(暖氣類)等,這樣就會導致 ”子類爆炸“問題,爲了解決這個問題,我們可以使用裝飾者模式來動態地給一個對象添加額外的職責。下面讓我們看看裝飾者模式。

二:概念定義 

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

 三:案例解析

以建房子的場景來舉例,具體實現方式代碼如下!

//定義房子抽象類,即裝飾者模式中的抽象組件類
public abstract class House
{
   public abstract void SetHouse();
}
 //具體類型,建粉色的房子,即裝飾着模式中的具體組件類
 public sealed class PinkHouse : House
    {
        public override void SetHouse()
        {
             
        }
    }

 

  // 裝飾抽象類,要讓裝飾完全取代抽象組件,所以必須繼承自House
  public abstract class GetHouseModel : House
    {
        public House house;
        public GetHouseModel(House houses)
        {
            this.house = houses;
        }

        public override void SetHouse()
        {
            if (house == null)
            {
                this.house.SetHouse();
            } 
        }
    }
//添加安防,具體裝飾者
 public sealed class HouseSecutity : GetHouseModel
    {
        public HouseSecutity(House house) : base(house) { }
        public override void SetHouse()
        {
            base.SetHouse();
            SetSecutity();
        }
        public void SetSecutity()
        {
            
        }
    }


//添加暖氣,具體裝飾者
public sealed class HosueWarm: GetHouseModel
    {
        public HosueWarm(House house) : base(house) { }
        public override void SetHouse()
        {
            base.SetHouse();
            SetWarm();
        }
        public void SetWarm()
        {

        }
    }

 

四:具體調用

   public ObservermMode()
        {
            House _house = new PinkHouse();
            GetHouseModel getHouse = new HouseSecutity(_house);
            getHouse.SetHouse();

            getHouse = new HosueWarm(_house);
            getHouse.SetHouse();
            
            HouseSecutity secutity = new HouseSecutity(_house);
            HosueWarm warm = new HosueWarm(secutity);
            warm.SetHouse();

        }

 

以上便是裝飾者模式的全部內容,綜上所述,從上客戶端代碼可以看出,客戶端可以動態地將房子裝修項目(安防,暖氣)增加到房子上,如果需要添加房子安防時,此時只需要添加一個繼承GetHouseModel的手機外殼類,從而,裝飾者模式擴展性也非常好。 

五:總結

在裝飾者模式中各個角色有:

  • 抽象構件(Phone)角色:給出一個抽象接口,以規範準備接受附加責任的對象。
  • 具體構件(AppPhone)角色:定義一個將要接收附加責任的類。
  • 裝飾(Dicorator)角色:持有一個構件(Component)對象的實例,並定義一個與抽象構件接口一致的接口。
  • 具體裝飾(Sticker和Accessories)角色:負責給構件對象 ”貼上“附加的責任。

優點:

  1. 裝飾這模式和繼承的目的都是擴展對象的功能,但裝飾者模式比繼承更靈活
  2. 通過使用不同的具體裝飾類以及這些類的排列組合,設計師可以創造出很多不同行爲的組合
  3. 裝飾者模式有很好地可擴展性

缺點

裝飾者模式會導致設計中出現許多小對象,如果過度使用,會讓程序變的更復雜。並且更多的對象會是的差錯變得困難,特別是這些對象看上去都很像。

應用場景:

  1. 需要擴展一個類的功能或給一個類增加附加責任。
  2. 需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
  3. 需要增加由一些基本功能的排列組合而產生的非常大量的功能

     

六:課後與練習

利用裝飾者模式完成對汽車Car的裝飾,汽車買下來之後需要安裝座套,行車記錄儀,還需要安裝腳墊等等東西。請用裝飾者模式設計並完成內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章