定義:動態地給一個對象添加一些額外的職責。就增長功能來講,裝飾器模式相比生成子類更爲靈活。
角色:
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); }