設計模式(八):裝飾模式

K戰神發表於2016-01-11

一、定義

裝飾者模式:動態地給一個物件新增一些額外的職責,就增加功能來說,Decorator模式比生成子類更為靈活。

Decorator模式的工作原理是:可以建立始於Decorator物件(負責新的功能的物件)終於原物件的一個物件“鏈”。

二、例項:手機螢幕裝飾

2.1 手機

public abstract  class Phone
    {
        public abstract void Print();        
    }

    public class Apple : Phone
    {
        public override void Print()
        {
            Console.WriteLine("我是蘋果手機");
        }
    }

2.2 裝飾者

這裡的關鍵就是形成一個鏈

public abstract class BaseDecorator : Phone
    {
        public Phone phone;
        public BaseDecorator(Phone p)
        {
            phone = p;
        }
        public override void Print()
        {
            if (phone != null)
            {
                phone.Print();
            }
        }
    }

 

 public class Screen:BaseDecorator
    {
        public Screen(Phone p) : base(p)
        {
        }
        public override void Print()
        {
            Decorat();
            base.Print();
           
        }
        private void Decorat()
        {
            Console.WriteLine("螢幕裝飾.");
        }
    }

    public class Num : BaseDecorator
    {
        public Num(Phone p) : base(p)
        {
        }
        public override void Print()
        {
            Decorat();
            base.Print();
           
        }
        private void Decorat()
        {
            Console.WriteLine("鍵盤裝飾.");
        }
    }

2.3 客戶端

//-----------------------裝飾模式---------------------
            Decorator.Phone phone = new Decorator.Apple();
            Decorator.BaseDecorator screen = new Decorator.Screen(phone);
            Decorator.BaseDecorator num = new Decorator.Num(screen);
            num.Print();
            Console.ReadKey();

 執行時多型,首先有手機而且是一部蘋果手機,接下來我要裝飾這部手機的螢幕(貼個膜?),然後再去在按鍵上做裝飾(貼個鑽?)

當我們執行 按鍵的輸出—>輸出“鍵盤裝飾”—>而後轉入父類的輸出函式—>鍵盤的父類是Screen—>此時執行父類的輸出函式,“螢幕裝飾”—>以此類推直到物件本身

 

三、總結

裝飾模式將多型在執行時運用得很巧妙,實現了裝飾鏈,從最小到最外層的層層裝飾。這樣的設計可以更好的擴充我們的類的功能。

相關文章