毛坯還是精裝修,先看看樣板房,『裝飾模式』

目錄:設計模式之小試牛刀
源碼路徑:Github-Design Pattern


定義:(Decorator Pattern)

動態地給一個對象添加一些額外的職責。就增加功能來說,裝飾模式相比生成子類更為靈活。

類圖:

裝飾模式通用類圖

啟示:

最近兩年,樓市瘋狂,房價漲的離譜。這不,為了在深圳有個自己的小家,筆者當然也要出去看看房啊,合適就出手買一套啊。首先在網上就是一通了解啊,深圳的房價基本5萬起步,動輒十萬以上。算了,筆者這點小工資就只能退而求其次,去惠州看房去。
第一次看房,難免不懂門道。先跟著銷售轉轉看吧。
先去看看毛坯房,那完全沒有感覺啊。粗糙地面,水電未通。

毛坯房

算了還是直接去看樣板房吧。
樣板房一進門就不一樣啊,那裝修,那氣派,那家具,往沙發一坐,家的感覺立馬油然而生!!!

樣板房

這一坐不打緊,靈感乍現啊,毛坯房和樣板房不就是裝飾模式的現實實例嗎?!

來來來,上代碼,咱看看裝飾模式的具體實現。

代碼:

先看看毛坯房的簡單實現:

 /// <summary>
    /// 抽象房類
    /// </summary>
    public abstract class AbstractHouse
    {
        /// <summary>
        /// 面積
        /// </summary>
        public double Area { get; set; }

        /// <summary>
        /// 規格
        /// </summary>
        public string Specification { get; set; }

        /// <summary>
        /// 價格
        /// </summary>
        public decimal Price { get; set; }

        /// <summary>
        /// 定義抽象方法--展示
        /// </summary>
        public abstract void Show();
    }

    /// <summary>
    /// 未裝修房 -- 毛坯房
    /// </summary>
    public class WithoutDecoratorHouse : AbstractHouse
    {
        /// <summary>
        /// 毛坯房就做簡要展示
        /// </summary>
        public override void Show()
        {
            Console.WriteLine(string.Format("該戶型為{0}㎡,戶型設計為{1},目前均價為{2}元/㎡。", this.Area, this.Specification, this.Price));
        }
    }

毛坯房真是內行看門道,外行看熱鬧啊,筆者自然是看不懂啊。
走看看樣板房去。

 /// <summary>
    /// 裝修房
    /// </summary>
    public abstract class DecoratorHouse : AbstractHouse
    {
        private readonly AbstractHouse house;

        public DecoratorHouse(AbstractHouse house)
        {
            this.house = house;
        }
        public override void Show()
        {
            this.house.Show();
        }
    }

    /// <summary>
    /// 裝修房--樣板房
    /// </summary>
    public class ModelHouse : DecoratorHouse
    {
        public ModelHouse(AbstractHouse house) : base(house)
        {
        }

        /// <summary>
        /// 展示樣板房細節
        /// </summary>
        private void ShowDetail()
        {
            Console.WriteLine(@"
* 首先,您看到的是我們大概5平方的簡單實用的入戶花園。
* 樣板間的整體按歐式風格裝修,精致溫馨。
* 進門右看是我們的餐廚一體化設計,客廳與餐廳動線相連,擴大了整個的空間視野。
* 與客廳無縫連接的是超大的觀景陽臺,東南朝向,陽光充沛。
* 動靜分離的設計,將客廳與臥室進行有效的分離,保證了私密性及舒適度。
* 主臥的落地窗設計,提供了足夠的室內的采光度。
* 主臥旁邊的是干濕分離的衛生間。
* 再旁邊就是兩個緊挨的房間,可按居家情況設計為兒童房、老人房或書房。");
        }

        public override void Show()
        {
            base.Show();
            ShowDetail();
        }
    }

經過銷售人員這么一講解,然后往樣板房客廳的沙發上一坐,是不是立馬就有家的感覺?!好,就這個戶型了。

上場景類:

static void Main(string[] args)
        {
            Console.WriteLine("裝飾模式:");
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("先看毛坯房:");
            //未經裝修的毛坯房
            var withoutDecoratorHouse = new WithoutDecoratorHouse()
            {
                Area = 80.0,
                Specification="三室一廳一衛",
                Price = 8000
            };

            withoutDecoratorHouse.Show();
            Console.WriteLine("-------------------------------------------------");
            Console.WriteLine("再看樣板房:");
            //對毛坯房進行裝修
            var decoratorHouse = new ModelHouse(withoutDecoratorHouse);
            decoratorHouse.Show();
            Console.WriteLine("-------------------------------------------------");
            Console.ReadLine();
        }
運行結果

總結

裝飾模式是通過Decorator(裝飾角色)構造函數的注入對被裝飾者者的引用,來間接完成對被裝飾對象功能的動態添加。

優缺點:

優點
裝飾類和被裝飾類可以獨立發展且不相互耦合。
裝飾模式是繼承關系的一個替代方案。
裝飾模式可以動態地擴展一個實現類的功能。
缺點
多層的裝飾的情況下,導致層層嵌套,導致代碼緊耦合。

應用場景:

需要擴展一個類的功能,或給一個類增加附加功能。
需要動態地給一個對象增加功能,這些功能可以再動態地撤銷。
要為一批的兄弟類進行改裝或加裝功能,當然是首選裝飾模式。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容