裝飾模式

定義:動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾器模式相比生成子類更爲靈活。
角色:
Component:抽象構件角色,定義一個抽象接口,以規範準備接收附加責任的對象。
ConcreteComponent:具體組件,這是被裝飾者,定義一個將要被裝飾增長功能的實體
Decorator:裝飾角色,持有一個構件對象的實例,並定義了抽象構件定義的接口。
ConcreteDecorator:負責給構件添加增長的功能。
結構圖:ide

優勢:在不想增長不少子類的狀況下擴展類。
缺點:多層裝飾比較複雜。this

使用:開發一個簡單的播放器,咱們經過第一次裝飾能夠爲播放器增長播放音樂的功能,具體包括播放全部的音頻格式文件,經過第二次裝飾,咱們能夠爲這個播放器添加播放視頻格式文件的功能。spa

1.Compenent接口定義:3d

public interface IPlayer 
{ 
    void Play(); 
}

2.被裝飾者ConCreatCompenent實現:code

public class Player : IPlayer 
{ 
    public void Play() 
    { 
        throw new NotImplementedException(); 
    }
}

3.裝飾器接口Decorator實現:視頻

public  interface IDecorator : IPlayer 
{
}

4.裝飾器的抽象基類Decorator實現:對象

public abstract class DecoratorBase : IDecorator 
{ 
       protected IPlayer play = null; 
       public DecoratorBase(IPlayer player) 
       { 
           this.play = player; 
       }
       public abstract void Play();
}

5.音樂播放器裝飾器 和視頻播放器裝飾類 ConcreteDecorator實現:blog

    public class MusicDecorator : DecoratorBase 
    { 
         public MusicDecorator(IPlayer play) 
            : base(play) 
        { 
        } 
        public override void Play() 
        { 
            throw new NotImplementedException(); 
        } 
    }
    p ublic class VedioDecorator : DecoratorBase 
    { 
        public VedioDecorator(IPlayer play) 
            : base(play) 
        { 
        } 
        public override void Play() 
        { 
            throw new NotImplementedException(); 
        } 
    }

6.具體調用:因爲裝飾角色傳入一個構件對象的實例,因此裝飾的對象的裝飾能夠精確到具體的裝飾角色。接口

static void Main(string[] args) 
{ 
    IPlayer play = new Player(); 
    play = new MusicDecorator(play); 
    play = new VedioDecorator(play); 
}
相關文章
相關標籤/搜索