首页 > 其他 > 详细

装饰模式

时间:2018-01-19 22:48:39      阅读:206      评论:0      收藏:0      [点我收藏+]

定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
角色:
Component:抽象构件角色,定义一个抽象接口,以规范准备接收附加责任的对象。
ConcreteComponent:具体组件,这是被装饰者,定义一个将要被装饰增加功能的实体
Decorator:装饰角色,持有一个构件对象的实例,并定义了抽象构件定义的接口。
ConcreteDecorator:负责给构件添加增加的功能。
结构图:

技术分享图片

优点:在不想增加很多子类的情况下扩展类。
缺点:多层装饰比较复杂。

使用:开发一个简单的播放器,我们通过第一次装饰可以为播放器增加播放音乐的功能,具体包括播放所有的音频格式文件,通过第二次装饰,我们可以为这个播放器添加播放视频格式文件的功能。

技术分享图片

1.Compenent接口定义:

public interface IPlayer 
{ 
    void Play(); 
}

2.被装饰者ConCreatCompenent实现:

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实现:

    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); 
}

 

装饰模式

原文:https://www.cnblogs.com/wang-jin-fu/p/8318980.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!