定义 我觉得装饰者模式是在已有功能的基础之上,动态地添加更多 功能的一种方式,这些新加的代码装饰了原有类的 核心职责或主要行为。...装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。...这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法签名完整性的前提下,提供了额外的功能。 实例 之前的项目中开发一款石油行业绘图软件,其中有图道和曲线绘制功能。...正好使用装饰者模式,在绘制曲线的同时,在不影响曲线绘制的前提下,根据用户需求动态增加各种额外的绘制功能。 废话不多说,上类图: ?...装饰模式提供了一个非常好的解决方案,它把每个要装饰的功能放在单独的类中,并让这个类包装它所要装饰的对象,因此,当需要执行特殊行为的时候,客户代码就可以在运行的时候根据需要有选择的、按顺序的使用装饰功能包装对象
一、相关介绍 1、装饰模式是为已有功能动态地添加更多功能的一种方式。 2、举例:QQ中的服装秀可以动态的搭配不同的服饰来进行修饰。...3、UML图 4、所属类别:结构型 其实其实现就是在具体的装饰类构造过程的输入参数可以是people类,也可以是具体的装饰类,每次添加新装饰功能后,再调用输入参数类的功能。...二、C++程序实现 1 // 装饰模式应用.cpp : 定义控制台应用程序的入口点。...Component(){} 13 virtual ~Component(){} 14 virtual void operate()=0; 15 }; 16 17 //定义两个需要被装饰的人...People2(){} 29 virtual ~People2(){} 30 virtual void operate(){} 31 }; 32 //定义一个抽象的装饰类
职责 动态的为一个对象增加新的功能 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。...从这里我们看出来,一个具体装饰器可以装饰多个具体构建组件,一个具体构建组件也可以有多个具体装饰器。它们之间没有耦合,彼此独立,从而可以达到动态增加功能。...开发中使用的场景 IO 中输入流和输出流的设计 Swing 包中图形界面构件功能 Servlet API 中提供了一个 request 对象的装饰模式的默认实现类 HttpServletRequestWrapper...大量小对象占据内存,一定程度上影响性能 装饰模式易于出错,调试排查比较麻烦 总结 装饰模式也叫包装器模式 装饰模式降低系统的耦合度,可以动态的增加和删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化...装饰模式的关键词 动态增加功能 组合替代继承
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。...那么应用装饰模式以后的类图结构如下所示: image.png 这个结构似乎与组合模式非常像,然而内部却大有不同。...截止到Decorate部分,左上部分完全与组合模式相同,Decorate类是装饰类的核心类。...由于装饰模式中所有新增的类都是构建类的子类,并且他们每个类都声明了以构建类对象为参数的构造函数,因此,具体装饰类可以直接套用拓展,正如以上代码所示。...在JavaIO中,装饰模式得到了广泛使用。
装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。...比如游戏机有一个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
装饰模式(Decorator)又名包装模式(Wrapper)。 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。...装饰模式的结构 模式的类图 ? 角色如下: 抽象构件角色(Component): 给出一个抽象接口,以规范准备接受附加责任的对象。...装饰模式的优点和缺点 优点: 1 . 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 2....缺点: 使用装饰模式,可以比使用继承关系需要较少数目的类。 使用较少数目的类,当然使设计比较易于进行。 使用装饰模式会产生比使用继承关系更多的对象。...模式的简化 大多数情况下,装饰模式的实现都比本节定义中给出的示意性实现要简单。 对模式进行简化时,要注意以下情况: 1. 一个装饰类的接口必须与被装饰类的接口相容。 2.
装饰模式 动态的给对象添加职责 Decorator.PNG 用例: 给一个人添加装饰 class Program { static void Main(string[] args
在装饰模式中引入装饰类,在装饰类中即可以调用被装饰类的方法,还可以定义新的方法,以便扩充类的功能。...装饰模式降低了系统的耦合度,可以动态增加或删除对象的职责,并使得需要装饰的具体构件类和具体装饰类可以独立变化,增加新的具体构件类和具体装饰类都非常方便。...装饰模式(Decorator Pattern)定义:动态地给一个对象增加一些额外的职责(Responsibility),就增加对象功能来说,装饰模式比生成子类实现更为灵活。...装饰模式的结构可用如下UML类图表示: ? 装饰模式包含如下的角色: ⑴Component(抽象构件) 抽象构件定义了对象的接口,可以给这些对象动态增加职责(方法)。...Java IO中大量使用了装饰模式,可参考我的博文:Java IO的装饰模式
概述 23种设计模式之一,英文叫DecoratorPattern,中文也叫装饰模式、修饰模式。装饰模式是在不改变类文件和不使用继承的情况下,运行期动态扩展一个对象的功能。...装饰类实现新的功能,但是,在不需要用到新功能的地方,它可以直接调用原来的类中的方法。修饰类必须和原来的类有相同的接口(没有接口可以直接继承自原来的类)。修饰模式是类继承的另外一种选择。...类继承在编译时候增加行为,而装饰模式是在运行时增加行为。 UML ? 实现 Component.java,接口。...BufferedInputStream bis = new BufferedInputStream(new FileInputStream("")); 上面就是装饰模式的模型,如果有不明白,可以结合代码...总结 装饰模式是不使用继承的情况下,可以动态扩展一个类,并且比继承更灵活(上面的实例)。
符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。...一般装饰器模式需要包涵几个个东西: 操作接口约束 操作具体实现类即被装饰对象 装饰器约束 装饰器实现 Laravel的中间件就是如此设计, 具体大家可以看看 源码, 这里不多赘述 ?...例如说: 我们常见到的一些美女拍照, 对吧, 照片不是一拍就那么好看的吧(当然, 有好看的麻烦介绍给博主)。拍出的照片需要装饰一下,而且这个装饰可能是在拍照前及拍照后,因为拍照前不得开美颜?...如果我们单独写一个拍照的类, 那要增加这些东西是肯定需要修改代码的, 且不利于复用, 你看有些天生丽质的, 就不需要这么些乱七八糟, 只要拍照就行, 那为了我们的程序可扩展性更强, 我们这边使用装饰器模式来实现一下吧...; } } /** * 设计装饰器的约束 只要是继承抽象的都应该拥有一个拍照对象, 你要装饰也要约束, 装饰的哪个方法?
在这个类中定义一个Component类型的对象,通过调用Component的display()方法来显示最基本的构件,同时再通过setScrollBar()方法对基本构件的功能进行增强 表述 (结构型模式...) 动态地给一个对象添加一些额外的职责,就扩展功能来说,装饰模式比生成子类更加灵活 装饰模式类图 组合模式类图 Component(抽象构件):定义一个对象接口,可以给这些对象动态添加职责 ConcreteComponent...,装饰模式比继承更加灵活性,不会导致类的个数急剧增加 可以通过一种动态的方式来扩展一个对象的功能,通过配置文件可以在运行时选择不同的具体装饰类,从而实现不同的行为 可以对一个对象进行多次装饰,通过使用不同的具体装饰类以及这些装饰类的排列组合...,可以创造出很多不同行为的组合,得到功能更为强大的对象 具体构件类与具体装饰类可以独立变化,用户可以根据需要增加新的具体构件类和具体装饰类,原有类库代码无须改变,符合“开闭原则” 缺点 使用装饰模式进行系统设计时将产生很多小对象...,这样,对于客户端而言,无论是装饰之前的对象还是装饰之后的对象都可以一致对待 尽量保持具体构件类ConcreteComponent是一个“轻”类,也就是说不要把太多的行为放在具体构件类中,我们可以通过装饰类对其进行扩展
装饰模式:简单的来说就是动态的给一个对象增加额外的功能,就单纯的新增功能来说会比单一的给一个子类新增功能来的灵活,是跟代理模式中的静态代理模式和动态代理模式十分相近,但是静态代理会使得代码非常臃肿,...维护性比较差,但是动态代理使用代理类,让代理类只是存在于内存当中运行,不需要产生具体的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独有的方法");
装饰者模式 模式定义 在不改变原有对象的基础上,将功能附加到对象上 应用场景 拓展一个类的功能或者给一个类添加附加职责 优点 不改变原有对象的情况下给一个对象拓展功能 使用不同的组合实现不同的效果 符合开闭原则...Component{ @Override public void operation() { System.out.println("拍照"); } } //装饰器
装饰器模式 装饰器模式Decorator Pattern允许向一个现有的对象添加新的功能,同时又不改变其结构,这种类型的设计模式属于结构型模式,是作为现有的类的一个包装。...这种模式创建了一个装饰类,用来包装原有的类,并在保持类方法完整性的前提下,提供了额外的功能。...装饰模式以对客户透明的方式动态地给一个对象附加上更多的责任,也就是说客户端并不会觉得对象在装饰前和装饰后有什么不同,装饰模式可以在不需要创造更多子类的情况下,将对象的功能加以扩展。...优点 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。...这种比继承更加灵活机动的特性,也同时意味着装饰模式比继承更加易于出错,排错也很困难,对于多次装饰的对象,调试时寻找错误可能需要逐级排查,较为烦琐。
前言 本文写于阅读《Head First 设计模式》第三章之后,因此文中举例大部分是”复盘”书中所写,以起到加深理解和记忆的作用....介绍 定义 装饰模式是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。 设计原则 多组合,少继承。...定义基类 在装饰者模式中,被装饰者和装饰者继承自同一个基类,我们定义为Component,每个Component有自己的名字以及价钱. public class Component { private...而使用装饰者模式,可以很轻松的处理各种附加要求. 特点 通过上面的例子,我们可以总结一下装饰者模式的特点。 (1)装饰者和被装饰者有相同的接口(或有相同的父类)。...优缺点 优点 扩展性好 符合开闭原则 缺点 会有许多的装饰类,导致程序复杂性提高 装饰者模式在JDK中的应用 在书中介绍完”星巴慈咖啡”的例子后,提到了在java.io包中大量使用了装饰者模式,这里对io
模式的定义 如何实现灵活的奖金计算?...装饰模式的定义: 动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 2. UML图 ?...; System.out.println(user+"当月团队业务奖金"+prize); return money + prize; } }/** * 使用装饰模式的客户端...研磨设计模式 1)装饰模式的功能:实现动态地为对象添加功能,一层一层的包装 2)类功能的扩展:1. 继承 2.对象的组合 3)Java中的装饰模式:IO流 ?.../调用业务功能 ebi.sale("张三","张三丰", saleModel); ebi.sale("李四","张三丰", saleModel); } } 5)装饰器模式的本质
装饰器模式 动态地给一个对象添加一些额外的职责,装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。...装饰器模式意图和结构 装饰者模式提供了一种给类增加功能的方法,它通过动态组合可以给原有的代码新增加新的代码,达到修改现有代码的目的,因此我们可以用在修复bug上。...装饰者模式主要有Component、ConcreteComponent、Decorator和ConcreteDecorator组成。 ...改变对象外壳与改变对象内核:装饰器就想对象的外壳,改变的是对象的行为;而当被装饰对象过于庞大和复杂时,装饰器就显得力不从心了,这时候,后面会介绍的Strategy模式可能是一个更好的选择。...在以下两种情况下可以考虑使用装饰器模式: (1)需要在不影响其他对象的情况下,以动态、透明的方式给对象添加职责。 (2)如果不适合使用子类来进行扩展的时候,可以考虑使用装饰器模式。
解决方法——装饰者模式 装饰者模式可以动态的将职责添加,不影响原来的类 装饰者模式的图示 image.png 装饰者模式的组成 1. Component 抽象组件,也叫装饰者的基类。...通过基类和多态的应用,才能实现装饰者模式 2. ConcreteComponent 具体组件,又叫被装饰对象,可以动态的给它添加职责 3. Decorator 装饰者抽象类 4....具体的装饰者类。...可以扩展部分 5 在ConcretComponnet和ConcreteDecorator相同的方法MehtodeA 举例 IO的装饰者模式 image.png 使用 如下就动态的给fileInputStream
装饰者模式(Decorator Pattern) 定义 在不改变原代码结构的情况下,动态地扩展一个对象的功能,相比继承有更灵活的实现方式。...见名知意,其就是在需要增强功能的对象上包装一层代码,达到增强功能的效果 作用 装饰者模式在对象创建好之后才动态给对象增加功能,也可以选择不增加,自由灵活。...class MyDog implements Dog { public void eat() { System.out.println("狗吃肉"); } } 下面我们使用装饰者模式给狗狗增加功能...WashHandDog(mydog); mydog = new BeatMonster(mydog); mydog.eat(); } 吃饭前洗手 狗吃肉 我的狗狗还能打怪兽 至此我们的装饰者模式就搞定了...,是不是很简单,以后遇到增强功能的需求时可以想一想装饰者模式
显然不科学,所以我们需要装饰者模式 装饰者模式定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。...要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为 这次我们要来将买一个带有milk和suger的一杯drink 先定义一个接口 public interface Drink...} @Override public double getPrice() { return drink.getPrice(); } } 接下来就是各个装饰类了
领取专属 10元无门槛券
手把手带您无忧上云