ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 软件工程 >> 设计模式(九)装饰者模式(Decorator Pattern)

设计模式(九)装饰者模式(Decorator Pattern)(1/3)

来源:网络整理     时间:2016-03-28     关键词:

本篇文章主要介绍了"设计模式(九)装饰者模式(Decorator Pattern)",主要涉及到方面的内容,对于软件工程感兴趣的同学可以参考一下: 一、引言  在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如S...

一、引言

  在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类)、AccessoriesPhone(挂件手机类)等,这样就会导致 ”子类爆炸“问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责。下面让我们看看装饰者模式。

二、装饰者模式的详细介绍

2.1 定义

  装饰者模式以对客户透明的方式动态地给一个对象附加上更多的责任,装饰者模式相比生成子类可以更灵活地增加功能。

2.2 装饰者模式实现

这里以手机和手机配件的例子来演示装饰者模式的实现,具体代码如下:

////// 手机抽象类,即装饰者模式中的抽象组件类
    ///publicabstractclass Phone
    {
        publicabstractvoid Print();
    }
    ////// 苹果手机,即装饰着模式中的具体组件类
    ///publicclass ApplePhone:Phone
    {
        ////// 重写基类方法
        ///publicoverridevoid Print()
        {
            Console.WriteLine("开始执行具体的对象——苹果手机");
        }
    }
    ////// 装饰抽象类,要让装饰完全取代抽象组件,所以必须继承自Photo
    ///publicabstractclass Decorator:Phone
    {
        private Phone phone;
        public Decorator(Phone p)
        {
            this.phone = p;
        }
        publicoverridevoid Print()
        {
            if (phone != null)
            {
                phone.Print();
            }
        }
    }
    ////// 贴膜,即具体装饰者
    ///publicclass Sticker : Decorator
    {
        public Sticker(Phone p)
            : base(p)
        {
        }
        publicoverridevoid Print()
        {
            base.Print();
            // 添加新的行为            AddSticker();    
        }
        ////// 新的行为方法
        ///publicvoid AddSticker()
        {
            Console.WriteLine("现在苹果手机有贴膜了");
        }
    }
    ////// 手机挂件
    ///publicclass Accessories : Decorator
    {
        public Accessories(Phone p)
            : base(p)
        {
        }
        publicoverridevoid Print()
        {
            base.Print();
            // 添加新的行为            AddAccessories();        
        }
        ////// 新的行为方法
        ///publicvoid AddAccessories()
        {
            Console.WriteLine("现在苹果手机有漂亮的挂件了");
        }
    }

此时客户端调用代码如下:

相关图片

相关文章