首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

详解设计模式:装饰器模式

装饰器模式 的核心是功能扩展,使用装饰器模式可以透明且动态地扩展类的功能 ~ 本篇内容包括:关于装饰器模式、装饰器实现 Demo ---- 文章目录 一、关于装饰器模式 1、关于装饰器模式 2、...关于装饰器模式的构成 3、关于装饰器模式的UML 4、关于装饰器模式的优缺点 5、装饰器模式、代理模式之间的区别 二、装饰器实现 Demo 1、Demo 实现 2、Demo 测试 ---- 一、关于装饰器模式...1、关于装饰器模式 装饰器模式(Decorator Pattern)也称为包装模式(Wrapper Pattern),是 GoF 的 23 种设计模式中的一种结构型设计模式。...3、关于装饰器模式的UML 4、关于装饰器模式的优缺点 # 装饰器模式的优点 功能扩展灵活,而不依赖继承; 可以对同一个对象进行多种装饰; # 装饰器模式的缺点 装饰方式可能比较复杂,如果嵌套太多,容易造成代码可读性变差和出错...5、装饰器模式、代理模式之间的区别 对装饰器模式来说,装饰者(decorator)和被装饰者(decoratee)都实现同一个接口。

37740

六、门面模式与装饰器模式详解

8.门面模式 8.1.课程目标 1、掌握门面模式和装饰器模式的特征和应用场景 2、理解装饰器模式和代理模式的根本区别。 3、了解门面模式的优、缺点。 4、了解装饰器模式的优、缺点。...9.装饰器模式 9.1.装饰器模式定义 装饰器模式(Decorator Pattern),也称为包装模式(Wrapper Pattern)是指在不改变原有对象 的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案...就增加功能来说,装饰器模式相比生成子类更为灵活。 装饰器模式的核心是功能扩展。使用装饰器模式可以透明且动态地扩展类的功能。 装饰器模式主要用于透明且动态地扩展类的功能。...9.4.装饰器模式和代理模式对比 从代理模式的 UML类图和通用代码实现上看,代理模式与装饰器模式几乎一模一样。...确实,从代码实现上看,代 理模式的确与装饰器模式是一样的(其实装饰器模式就是代理模式的一个特殊应用),但是这两种设计 模式所面向的功能扩展面是不一样的: 装饰器模式强调自身功能的扩展。

1.5K10
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    装饰模式

    职责 动态的为一个对象增加新的功能 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。...从这里我们看出来,一个具体装饰器可以装饰多个具体构建组件,一个具体构建组件也可以有多个具体装饰器。它们之间没有耦合,彼此独立,从而可以达到动态增加功能。...开发中使用的场景 IO 中输入流和输出流的设计 Swing 包中图形界面构件功能 Servlet API 中提供了一个 request 对象的装饰模式的默认实现类 HttpServletRequestWrapper...大量小对象占据内存,一定程度上影响性能 装饰模式易于出错,调试排查比较麻烦 总结 装饰模式也叫包装器模式 装饰模式降低系统的耦合度,可以动态的增加和删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化...装饰模式的关键词 动态增加功能 组合替代继承

    35420

    装饰模式

    在装饰模式中引入装饰类,在装饰类中即可以调用被装饰类的方法,还可以定义新的方法,以便扩充类的功能。...装饰模式降低了系统的耦合度,可以动态增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,增加新的具体构件类和具体装饰类都非常方便。...装饰模式(Decorator Pattern)定义:动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。...装饰模式的结构可用如下UML类图表示: ? 装饰模式包含如下的角色: ⑴Component(抽象构件) 抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法)。...Java IO中大量使用了装饰模式,可参考我的博文:Java IO的装饰模式

    50020

    装饰模式

    概述 23种设计模式之一,英文叫DecoratorPattern,中文也叫装饰模式、修饰模式。装饰模式是在不改变类文件和不使用继承的情况下,运行期动态扩展一个对象的功能。...装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口(没有接口可以直接继承自原来的类)。修饰模式是类继承的另外一种选择。...类继承在编译时候增加行为,而装饰模式是在运行时增加行为。 UML ? 实现 Component.java,接口。...BufferedInputStream bis = new BufferedInputStream(new FileInputStream("")); 上面就是装饰模式的模型,如果有不明白,可以结合代码...总结 装饰模式是不使用继承的情况下,可以动态扩展一个类,并且比继承更灵活(上面的实例)。

    48500

    设计模式 | 装饰模式

    符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。...一般装饰器模式需要包涵几个个东西: 操作接口约束 操作具体实现类即被装饰对象 装饰器约束 装饰器实现 Laravel的中间件就是如此设计, 具体大家可以看看 源码, 这里不多赘述 ?...拍出的照片需要装饰一下,而且这个装饰可能是在拍照前及拍照后,因为拍照前不得开美颜?拍完后不得p图??...如果我们单独写一个拍照的类, 那要增加这些东西是肯定需要修改代码的, 且不利于复用, 你看有些天生丽质的, 就不需要这么些乱七八糟, 只要拍照就行, 那为了我们的程序可扩展性更强, 我们这边使用装饰器模式来实现一下吧...; } } /** * 设计装饰器的约束 只要是继承抽象的都应该拥有一个拍照对象, 你要装饰也要约束, 装饰的哪个方法?

    28220

    设计模式 -- 装饰模式

    在这个类中定义一个Component类型的对象,通过调用Component的display()方法来显示最基本的构件,同时再通过setScrollBar()方法对基本构件的功能进行增强 表述 (结构型模式...) 动态地给一个对象添加一些额外的职责,就扩展功能来说,装饰模式比生成子类更加灵活 装饰模式类图 组合模式类图 Component(抽象构件):定义一个对象接口,可以给这些对象动态添加职责 ConcreteComponent...,装饰模式比继承更加灵活性,不会导致类的个数急剧增加 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合...,可以创造出很多不同行为的组合,得到功能更为强大的对象 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则” 缺点 使用装饰模式进行系统设计时将产生很多小对象...,这样,对于客户端而言,无论是装饰之前的对象还是装饰之后的对象都可以一致对待 尽量保持具体构件类ConcreteComponent是一个“轻”类,也就是说不要把太多的行为放在具体构件类中,我们可以通过装饰类对其进行扩展

    17810

    设计模式~装饰模式

    装饰模式(Decorator)又名包装模式(Wrapper)。 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。...装饰模式的结构 模式的类图 ? 角色如下: 抽象构件角色(Component): 给出一个抽象接口,以规范准备接受附加责任的对象。...装饰模式的优点和缺点 优点: 1 . 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 2....缺点: 使用装饰模式,可以比使用继承关系需要较少数目的类。 使用较少数目的类,当然使设计比较易于进行。 使用装饰模式会产生比使用继承关系更多的对象。...模式的简化 大多数情况下,装饰模式的实现都比本节定义中给出的示意性实现要简单。 对模式进行简化时,要注意以下情况: 1. 一个装饰类的接口必须与被装饰类的接口相容。 2.

    28630

    PHP设计模式之装饰器模式定义与用法详解

    本文实例讲述了PHP设计模式之装饰器模式定义与用法。分享给大家供大家参考,具体如下: 什么是装饰器模式 作为一种结构型模式, 装饰器(Decorator)模式就是对一个已有结构增加"装饰"....装饰器模式是将一个对象包装起来以增强新的行为和责任.装饰器也称为包装器(类似于适配器) 有些设计设计模式包含一个抽象类,而且该抽象类还继承了另一个抽象类,这种设计模式为数不多,而装饰器就是其中之一....什么时候使用装饰器模式 基本说来, 如果想为现有对象增加新功能而不想影响其他对象, 就可以使用装饰器模式.如果你好不容易为客户创建了一个网站格式, 主要组件的工作都很完美, 客户请求新功能时, 你肯定不希望推翻重来...有些项目可能有时需要装饰, 而有时不希望装饰, 这些项目体现了装饰器设计模式的另一个重要特性.假设你的基本网站开发模式可以满足大多数客户的要求....利用装饰器模式, 不仅能提供核心功能, 还可以用客户要求的特有功能"装饰"这些核心功能. 简单的装饰器例子 一个web开发企业,计划建立一个基本网站,并提供一些增强功能.

    44720

    设计模式-装饰模式

    装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,...维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的java文件,这样的模式会更加的优秀.接下来是本章的装饰模式 【本文使用lombok依赖,如果不想使用的可以直接使用...super.opeartion(); addedState ="New State"; System.out.println("具体的装饰对象...opeartion() { super.opeartion(); AddedBehavior(); System.out.println("具体装饰对象...B的操作"); } private void AddedBehavior(){ System.out.println("装饰B独有的方法");

    45210

    装饰器模式

    装饰器模式 装饰器模式Decorator Pattern允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型模式,是作为现有的类的一个包装。...这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额外的功能。...装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,也就是说客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。...优点 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。...这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。

    57442

    装饰者模式

    前言 本文写于阅读《Head First 设计模式》第三章之后,因此文中举例大部分是”复盘”书中所写,以起到加深理解和记忆的作用....介绍 定义 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 设计原则 多组合,少继承。...定义基类 在装饰者模式中,被装饰者和装饰者继承自同一个基类,我们定义为Component,每个Component有自己的名字以及价钱. public class Component { private...而使用装饰者模式,可以很轻松的处理各种附加要求. 特点 通过上面的例子,我们可以总结一下装饰者模式的特点。 (1)装饰者和被装饰者有相同的接口(或有相同的父类)。...优缺点 优点 扩展性好 符合开闭原则 缺点 会有许多的装饰类,导致程序复杂性提高 装饰者模式在JDK中的应用 在书中介绍完”星巴慈咖啡”的例子后,提到了在java.io包中大量使用了装饰者模式,这里对io

    39320

    装饰者模式

    装饰者模式的定义: 动态地将责任附加到对象上,若要拓展功能,装饰者提供了比继承更有弹性的替代方案对于设计模式。 总结: 先理解,搞清楚各大设计模式的好处。...再在个人/公司项目中使用设计模式,对于安卓开发工程师,接触的设计模式,可能要比后台开发人员多一点。建议不会安卓开发的适当去了解了解安卓开发。...如果想深入地了解设计模式的伙计们,建议去买一些相关书籍,书籍里面的解释往往更加生动,更加清楚。...,继承被装饰者,与被装饰者建立联系,拥有相同的“接口”,再由具体的装饰者类与被装饰者类,组合变成一个行为。...=name; 20 } 21 22 public double getPrice() { 23 return basicPrice; 24 } 25} 4.再建立水(被装饰者

    36340

    装饰者模式

    装饰者模式(Decorator Pattern) 定义 在不改变原代码结构的情况下,动态地扩展一个对象的功能,相比继承有更灵活的实现方式。...见名知意,其就是在需要增强功能的对象上包装一层代码,达到增强功能的效果 作用 装饰者模式在对象创建好之后才动态给对象增加功能,也可以选择不增加,自由灵活。...class MyDog implements Dog { public void eat() { System.out.println("狗吃肉"); } } 下面我们使用装饰者模式给狗狗增加功能...WashHandDog(mydog); mydog = new BeatMonster(mydog); mydog.eat(); } 吃饭前洗手 狗吃肉 我的狗狗还能打怪兽 至此我们的装饰者模式就搞定了...,是不是很简单,以后遇到增强功能的需求时可以想一想装饰者模式

    39450
    领券