• 装饰模式


    定义:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰器模式相比生成子类更为灵活。
    角色:
    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); 
    }
    一直想把之前工作、学习时记录的文档整理到博客上,一方面温故而知新,一方面和大家一起学习 -程序小白
  • 相关阅读:
    将h.264视频流封装成flv格式文件(一.flv格式)(转载)<a href="http://blog.csdn.net/yeyumin89/article/details/7932368"></a>
    01背包,求最大值
    JNI vc6.0 dll
    jni java c++ 参数传递问题解决
    (转载)将h.264视频流封装成flv格式文件(二.开始动手)http://blog.csdn.net/yeyumin89/article/details/7932431
    达到最高效益的调度
    按照RFC3984协议实现H264视频流媒体
    语音识别 转载 待测试
    活动选择问题 动态规划算法(最大子集合或最大收益)
    整齐打印
  • 原文地址:https://www.cnblogs.com/wang-jin-fu/p/8318980.html
Copyright © 2020-2023  润新知