iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何理解Java设计模式的装饰模式
  • 687
分享到

如何理解Java设计模式的装饰模式

2023-06-25 13:06:50 687人浏览 泡泡鱼
摘要

这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所

这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    一、前言

    装饰模式实际上是一直提倡的组合代替继承的实践方式,个人认为要理解装饰者模式首先需要理解为什么需要组合代替继承,继承又是为什么让人深恶痛绝.

    为什么建议使用组合代替继承?

    面向对象的特性有继承与封装,但两者却又有一点矛盾,继承意味子类依赖了父类中的实现,一旦父类中改变实现则会对子类造成影响,这是打破了封装性的一种表现. 而组合就是巧用封装性来实现继承功能的代码复用.

    二、什么是装饰模式

    1.定义:

    装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。

    2.意图

    动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。

    3.别名

    包装器Wrapper

    4.动机

    有时我们希望给某个对象而不是整个类添加一些功能。例如,一个图形用户界面工具箱允许你对任意一个用户界面组件添加一些组件,例如边框,或是一些行为,例如窗口滚动等。

    5.作用

    在不修改原有的接口的情况下,让类表现的更好。

    6.问题

    自然是继承有一些问题

    继承会导致超类和子类之间存在强耦合性,当超类改变时,子类也会随之改变;

    超类的内部细节对于子类是可见的,继承常常被认为破坏了封装性;

    三、装饰模式的结构

    如何理解Java设计模式的装饰模式

    在装饰器模式中的角色有:

    • 抽象构件(Component)角色:给出一个抽象接口,已规范准备接收附加责任的对象。

    • 具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类

    • 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

    • 具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任。

    四、装饰模式的使用场景

    需要扩展一个类的功能或给一个类增加附加责任。

    需要动态地给一个对象增加功能,这些功能可以再动态地撤销。

    需要增加由一些基本功能的排列组合而产生的非常大量的功能

    五、装饰模式的优缺点

    优点:

    装饰这模式和继承的目的都是扩展对象的功能,但装饰者模式比继承更灵活

    通过使用不同的具体装饰类以及这些类的排列组合,设计师可以创造出很多不同行为的组合

    装饰者模式有很好地可扩展性

    缺点:

    装饰者模式会导致设计中出现许多小对象,如果过度使用,会让程序变的更复杂。并且更多的对象会是的差错变得困难,特别是这些对象看上去都很像。

    六、装饰模式的实现

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

    客户端代码

    class Customer    {        static void Main(string[] args)        {            // 我买了个苹果手机            Phone phone = new ApplePhone();             // 现在想贴膜了            Decorator applePhoneWithSticker = new Sticker(phone);            // 扩展贴膜行为            applePhoneWithSticker.Print();            Console.WriteLine("----------------------\n");             // 现在我想有挂件了            Decorator applePhoneWithAccessories = new Accessories(phone);            // 扩展手机挂件行为            applePhoneWithAccessories.Print();            Console.WriteLine("----------------------\n");             // 现在我同时有贴膜和手机挂件了            Sticker sticker = new Sticker(phone);            Accessories applePhoneWithAccessoriesAndSticker = new Accessories(sticker);            applePhoneWithAccessoriesAndSticker.Print();            Console.ReadLine();        }

    从上面的客户端代码可以看出,客户端可以动态地将手机配件增加到手机上,如果需要添加手机外壳时,此时只需要添加一个继承Decorator的手机外壳类,从而,装饰模式扩展性也非常好。

    七、装饰模式的.net应用

    在.NET 类库中也有装饰者模式的实现,该类就是System.io.Stream

    MemoryStream memoryStream = new MemoryStream(new byte[] {95,96,97,98,99});             // 扩展缓冲的功能            BufferedStream buffStream = new BufferedStream(memoryStream);             // 添加加密的功能            CryptoStream cryptoStream = new CryptoStream(memoryStream,new AesManaged().CreateEncryptor(),CryptoStreamMode.Write);            // 添加压缩功能            GZipStream gzipStream = new GZipStream(memoryStream, CompressionMode.Compress, true);

    到此,关于“如何理解Java设计模式的装饰模式”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

    --结束END--

    本文标题: 如何理解Java设计模式的装饰模式

    本文链接: https://www.lsjlt.com/news/305059.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • 如何理解Java设计模式的装饰模式
      这篇文章主要介绍“如何理解Java设计模式的装饰模式”,在日常操作中,相信很多人在如何理解Java设计模式的装饰模式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java设计模式的装饰模式”的疑惑有所...
      99+
      2023-06-25
    • 深入理解Java设计模式之装饰模式
      目录一、前言二、什么是装饰模式1.定义:2.意图3.别名4.动机5.作用6.问题三、装饰模式的结构四、装饰模式的使用场景五、装饰模式的优缺点六、装饰模式的实现七、装饰模式的.NET应...
      99+
      2022-11-12
    • Java设计模式之装饰模式详解
      目录一、装饰模式引入例子1.1 一般设计1.2 使用继承方式的一般设计存在的问题二、装饰模式2.1 装饰(Decorator)模式中的角色2.2 装饰模式改进设计UML2.3 装饰模...
      99+
      2022-11-12
    • java设计模式-装饰者模式详解
      目录引例一般解法装饰者模式装饰者解法代码:抽象类装饰者被装饰者客户端测试总结:引例 需求:设现在有单品咖啡:Espresso(意大利浓咖啡)和LongBlack(美式咖啡),调料有M...
      99+
      2022-11-12
    • 详解Java设计模式中的装饰模式
      目录一、装饰模式的定义和特点二、装饰模式的结构三、咖啡点单案例演示四、总结一、装饰模式的定义和特点 在软件开发过程中,有时想用一些现存的组件。这些组件可能只是完成了一些核心功能。但在...
      99+
      2022-11-12
    • Java设计模式之java装饰者模式详解
      目录介绍角色示例代码星巴克咖啡的例子方案一方案二 :将调料内置到Drink类中方案三:装饰者模式代码演示装饰者模式的简化透明性的要求半透明的装饰模式装饰模式的优点装饰模式的缺点装饰模...
      99+
      2022-11-12
    • Java设计模式之装饰者模式详解
      目录具体代码:Person:Student:Doctor:DecoratePerson:ShoeDecorate:DressDecorate:总结 装饰器模式(Decorator P...
      99+
      2022-11-12
    • Java设计模式之装饰器模式
      本文由老王将建好的书房计划请小王来帮忙,小王却想谋权篡位,老王通过教育他引出装饰器设计模式,第二部分针对老王提出的建设性意见实现装饰器模式,第三部分针对装饰器模式在Jdk中的IO、S...
      99+
      2022-11-13
    • java 中设计模式(装饰设计模式)的实例详解
      java 中设计模式(装饰设计模式)的实例详解应用场景:在不对原有对象类进行修改的基础上,给一个或多个已有的类对象提供增强额外的功能. 我觉得可以从字面理解,装饰,装饰房子。房子可以看成原有的类。等于你把一个已经建好的房子按照自己的想法再装...
      99+
      2023-05-31
      java 装饰模式 ava
    • Java设计模式中的装饰者模式
      目录模式介绍UML类图装饰者模式案例装饰者模式优点装饰者模式缺点模式介绍 23种设计模式之一,英文叫Decorator Pattern,又叫装饰者模式。装饰模式是在不必改变原类文件和...
      99+
      2022-11-13
    • java设计模式学习之装饰模式
      装饰模式:动态的给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。优点:装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。缺点:多层装饰比较复杂。实例:给...
      99+
      2023-05-31
      java 设计模式 装饰模式
    • Java结构型设计模式之装饰模式详解
      目录介绍实现优缺点介绍 意图:动态地给一个对象添加一些额外的职责。就增加功能来说,装饰模式相比生成子类更灵活。 主要解决:我们扩展一个类常使用继承方式实现,由于继承为类引入静态特征,...
      99+
      2023-05-14
      Java设计模式装饰模式 Java装饰模式
    • Java中常用的设计模式之装饰器模式详解
      目录优点缺点使用场景一、实现方式二、测试总结优点 1.装饰类和被装饰类可以独立发展,不会相互耦合,装饰模式是继承的一个替代模式,装饰模式可以动态扩展一个实现类的功能。 缺点 2.多层...
      99+
      2022-11-13
    • Java设计模式的装饰器模式怎么实现
      本文小编为大家详细介绍“Java设计模式的装饰器模式怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java设计模式的装饰器模式怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是装饰器模式装饰器...
      99+
      2023-06-30
    • python设计模式之装饰器模式
      目录装饰器模式python 装饰器语法糖装饰器模式 装饰器模式解决什么问题? 增加新功能,且不改变原有功能和代码选配,根据不同情况,动态调整功能 装饰器,顾名思义,就是用来装饰其他实...
      99+
      2022-11-11
    • C++实现设计模式之装饰者模式详解
      目录设计模式和设计原则装饰者模式中的类案列描述代码实现总结设计模式和设计原则 装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者模式提供了比继承更有弹性的替代方案。 装饰者模式...
      99+
      2022-11-12
    • C#设计模式之装饰器模式实例详解
      最近踢了场球,9人制比赛,上半场我们采用防守阵型效果不佳,下半场采用进攻阵型取得了比赛的主动。我们上下半场所采取的策略,似乎可以用"装饰器"模式实现一遍。 首先肯...
      99+
      2022-11-13
    • Java通俗易懂系列设计模式之装饰模式
      目录介绍实现类图总结介绍 装饰模式,是面向对象编程领域中,一种动态地往一个类中添加新的行为的设计模式。就功能而言,装饰模式相比生成子类更为灵活,这样可以给某个对象而不是整个类添加一些...
      99+
      2022-11-12
    • 如何理解Java设计模式的解释器模式
      本篇内容主要讲解“如何理解Java设计模式的解释器模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的解释器模式”吧!一、什么是解释器模式定义:给定一个语言,定义一个文法...
      99+
      2023-06-25
    • 如何理解Java设计模式的命令模式
      本篇内容主要讲解“如何理解Java设计模式的命令模式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解Java设计模式的命令模式”吧!一、什么是命令模式命令模式是一个高内聚的模式,其定义为:...
      99+
      2023-06-25
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作