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

结构型设计模式装饰器(者)模式实例介绍

定义 我觉得装饰模式是在已有功能的基础之上,动态地添加更多 功能的一种方式,这些新加的代码装饰了原有类的 核心职责或主要行为。...装饰模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。...这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 实例 之前的项目中开发一款石油行业绘图软件,其中有图道和曲线绘制功能。...正好使用装饰模式,在绘制曲线的同时,在不影响曲线绘制的前提下,根据用户需求动态增加各种额外的绘制功能。 废话不多说,上类图: ?...装饰模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为的时候,客户代码就可以在运行的时候根据需要有选择的、按顺序的使用装饰功能包装对象

31230

装饰模式

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

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

装饰模式

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

44600

装饰模式

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

47020

Objective-C 装饰模式--简单介绍和使用

装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。...比如游戏机有一个GamePad类, 现在要增加一个作弊功能(例如100条命), 如果直接在GamePad类中去添加可能会影响其他子类的使用 我们考虑装饰模式思维, 先建立一个装饰器实现GamePad的所有功能..., 然后在装饰器类的子类中去添加作弊放方法 上代码 比如GamePad类是这样 1 #import 2 3 @interface GamePad...cheaterGamePad down]; 19 20 //实现作弊方法 21 [cheaterGamePad cheat]; 22 } 23 24 25 26 @end 这样就完成了一个装饰模式思路的代码构建...下面说说cocoa touch中自带的Category, 它也是对装饰模式的一个实现 我们用Category来实现上面GamePad添加作弊功能 我们创建一个Cheat Category GamePad

36130

设计模式~装饰模式

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

26730

设计模式 | 装饰模式

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

26720

设计模式 -- 装饰模式

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

14210

设计模式-装饰模式

装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,...维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的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独有的方法");

41610

装饰模式

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

54142

装饰模式

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

36520

装饰模式

装饰模式 动态地给一个对象添加一些额外的职责,装饰模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰模式的本质就是动态组合。...装饰模式意图和结构 装饰模式提供了一种给类增加功能的方法,它通过动态组合可以给原有的代码新增加新的代码,达到修改现有代码的目的,因此我们可以用在修复bug上。...装饰模式主要有Component、ConcreteComponent、Decorator和ConcreteDecorator组成。  ...改变对象外壳与改变对象内核:装饰器就想对象的外壳,改变的是对象的行为;而当被装饰对象过于庞大和复杂时,装饰器就显得力不从心了,这时候,后面会介绍的Strategy模式可能是一个更好的选择。...在以下两种情况下可以考虑使用装饰模式:     (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。     (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰模式

46180

装饰模式,不难!

装饰模式概述 2. 装饰模式的结构与实现 3. 装饰模式的应用实例 4. 透明装饰模式与半透明装饰模式 5....对象结构型模式 以对客户透明的方式动态地给一个对象附加上更多的责任 可以在不需要创建更多子类的情况下,让对象的功能得以扩展 装饰模式的结构 装饰模式包含以下4个角色: Component(抽象构件)...现使用装饰模式来设计该图形界面构件库。...透明装饰模式与半透明装饰模式 透明装饰模式 透明(Transparent)装饰模式:要求客户端完全针对抽象编程,装饰模式的透明性要求客户端程序不应该将对象声明为具体构件类型或具体装饰类型,而应该全部声明为抽象构件类型...装饰模式的优缺点与适用环境 模式优点 对于扩展一个对象的功能,装饰模式比继承更加灵活,不会导致类的个数急剧增加 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,

44130

装饰模式

这种给对象动态地增加职责的方式称为装饰者(decorator)模式装饰模式能够在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责。...和代理模式的区别 装饰模式和代理模式的结构看起来非常相像,这两种模式都描述了怎样为对象提供一定程度上的间接引用,它们的实现部分都保留了对另外一个对象的引用,并且向那个对象发送请求。...代理模式装饰模式最重要的区别在于它们的意图和设计目的。代理模式的目的是,当直接访问本体不方便或者不符合需要时,为这个本体提供一个替代者。...装饰模式的作用就是为对象动态加入行为。换句话说,代理模式强调一种关系(Proxy与它的实体之间的关系),这种关系在一开始就可以被确定。而装饰模式用于一开始不能确定对象的全部功能时。...代理模式通常只有一层代理本体的引用,而装饰模式经常会形成一条长长的装饰链。

51810
领券