23种设计模式——装饰模式

14 篇文章 0 订阅
7 篇文章 0 订阅

 

问题:

由于过多使用继承来扩展对象的功能。

举例:

给游戏写一种类型的tank,想让他实现红外线和水陆两栖的功能。

IA:红外线,IB:水,IC:陆。

由上述的例子可以看出来,如果T50Tank想要获得红外线和水陆两栖的功能,就要继承4个父类,这就导致了由于过多使用继承来扩展对象的功能,所以采用装饰模式来对代码进行修改。

思想:

继承是静态的,我们要实现动态的。

就比如虚方法是动态方法,程序需要调用他的时候才会使用到他,而上述的坦克的例子,属于继承给写死的静态方法,我们要通过装饰模式,当需要调用的时候才出现。而不是通过继承写死。

实现动态

应用:

面向对象的设计模式一定要稳定,如果需要新增加功能就要不破坏类型封装的情况下增加功能,实现开放封闭。装饰模式是结构型设计模式的巅峰之作。实质性和AOP差不太多,而AOP应用的比较广泛,而装饰模式用的不是特别多,比如说文件流就是通过装饰器叠加的。

代码演示:

有两个变量需要拓展功能

abstract class FreeAndVIp
    {
        public int ID { get; set; }
        public string Name { get; set; }
        public abstract void Study();
    }
  class Free : FreeAndVIp
    {
        public override void Study()
        {
            Console.WriteLine("白天上课");
            Console.WriteLine("免费学生视频回放");
        }
    }
 class VIP: FreeAndVIp
    {
        public override void Study()
        {
            Console.WriteLine("晚上上课");
        }
    }

有三个拓展的功能

 class ZUHEJIAJICHENGJUTI : ZUHEJIAJICHENG
    {
        public ZUHEJIAJICHENGJUTI(FreeAndVIp student):base(student)
        {
        }
        public override void Study()
        {
            base.Study();
            //增加自己的行为
            Console.WriteLine("获取音频");
        }
    }
class ZUHEJIAJICHENGJUTIAYI : ZUHEJIAJICHENG
    {
        public ZUHEJIAJICHENGJUTIAYI(FreeAndVIp student):base(student)
        {
        }
        public override void Study()
        {
            base.Study();
            //增加自己的行为
            Console.WriteLine("阿姨解答");
        }
    }
   class ZUHEJIAJICHENGJUTILIANXI : ZUHEJIAJICHENG
    {
        public ZUHEJIAJICHENGJUTILIANXI(FreeAndVIp student):base(student)
        {
        }
        public override void Study()
        {
            base.Study();
            //增加自己的行为
            Console.WriteLine("实践练习");
        }
    }

main函数调用,不断升级类继承里式转换思想。

static void Main(string[] args)
        {
            FreeAndVIp vip = new VIP()
            {
                ID = 1333,
                Name = "VIP"
            };

            #region 升级
            //ZUHEJIAJICHENG ZUHEJIAJICHENG = new ZUHEJIAJICHENG(vip);//升级  升级就是父类转子类 转到最上层 或者 转到父类一样的时候统一一下
            //FreeAndVIp ZUHEJIAJICHENG = new ZUHEJIAJICHENG(vip);//升级
            //vip.Study();

            //vip = new ZUHEJIAJICHENG(vip);//可以不要 里面是空的

            //ZUHEJIAJICHENGJUTI ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENGJUTI(vip);//升级
            //ZUHEJIAJICHENG ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENG(vip);//升级
            //FreeAndVIp ZUHEJIAJICHENGJUTI = new ZUHEJIAJICHENGJUTI(vip);//升级
            #endregion

            //任意扩展功能 任意调整顺序 修饰多种对象
            vip = new ZUHEJIAJICHENGJUTI(vip);
            vip = new ZUHEJIAJICHENGJUTIAYI(vip);
            vip = new ZUHEJIAJICHENGJUTILIANXI(vip);
            vip.Study();

            Console.WriteLine("*****************************");
            FreeAndVIp free = new Free()
            {
                ID = 123,
                Name = "Free"
            };
            free = new ZUHEJIAJICHENGJUTI(free);
            free = new ZUHEJIAJICHENGJUTIAYI(free);
            free = new ZUHEJIAJICHENGJUTILIANXI(free);
            free.Study();
        }

对上述代码的解释

用一个父类去里式转换需要的子类(变量和功能)

两个变量,三个拓展功能,任意拓展,任意排序,修饰多种对象。

总结

装饰模式是由静转动、组合继承共同发展,变量、功能共同继承父类的一种设计模式。充分的展示了面对对象开发,面对抽象编程的稳定性,充分展示了对拓展开放的便捷。在不破坏类封装的情况下拓展开发。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值