装饰模式 动态的给对象添加职责 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("")); 上面就是装饰模式的模型,如果有不明白,可以结合代码...总结 装饰模式是不使用继承的情况下,可以动态扩展一个类,并且比继承更灵活(上面的实例)。
一、相关介绍 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 //定义一个抽象的装饰类
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。...那么应用装饰模式以后的类图结构如下所示: image.png 这个结构似乎与组合模式非常像,然而内部却大有不同。...截止到Decorate部分,左上部分完全与组合模式相同,Decorate类是装饰类的核心类。...由于装饰模式中所有新增的类都是构建类的子类,并且他们每个类都声明了以构建类对象为参数的构造函数,因此,具体装饰类可以直接套用拓展,正如以上代码所示。...在JavaIO中,装饰模式得到了广泛使用。
职责 动态的为一个对象增加新的功能 装饰模式是一种用于代替继承的技术,无须通过继承增加子类就能扩展对象的新功能。...从这里我们看出来,一个具体装饰器可以装饰多个具体构建组件,一个具体构建组件也可以有多个具体装饰器。它们之间没有耦合,彼此独立,从而可以达到动态增加功能。...开发中使用的场景 IO 中输入流和输出流的设计 Swing 包中图形界面构件功能 Servlet API 中提供了一个 request 对象的装饰模式的默认实现类 HttpServletRequestWrapper...大量小对象占据内存,一定程度上影响性能 装饰模式易于出错,调试排查比较麻烦 总结 装饰模式也叫包装器模式 装饰模式降低系统的耦合度,可以动态的增加和删除对象的职责,并使得需要装饰的具体构建类和具体装饰类可以独立变化...装饰模式的关键词 动态增加功能 组合替代继承
装饰模式(Decorator)又名包装模式(Wrapper)。 装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。 装饰模式以对客户端透明的方式动态的给一个对象附加上更多的责任。...装饰模式的结构 模式的类图 ? 角色如下: 抽象构件角色(Component): 给出一个抽象接口,以规范准备接受附加责任的对象。...装饰模式的优点和缺点 优点: 1 . 装饰模式与继承关系的目的都是要扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。 2....缺点: 使用装饰模式,可以比使用继承关系需要较少数目的类。 使用较少数目的类,当然使设计比较易于进行。 使用装饰模式会产生比使用继承关系更多的对象。...模式的简化 大多数情况下,装饰模式的实现都比本节定义中给出的示意性实现要简单。 对模式进行简化时,要注意以下情况: 1. 一个装饰类的接口必须与被装饰类的接口相容。 2.
符合我们软件开发的开闭原则, 是一个非常经典的设计模式, 部分语言已经将装饰模式设计成了一种语法。...一般装饰器模式需要包涵几个个东西: 操作接口约束 操作具体实现类即被装饰对象 装饰器约束 装饰器实现 Laravel的中间件就是如此设计, 具体大家可以看看 源码, 这里不多赘述 ?...拍出的照片需要装饰一下,而且这个装饰可能是在拍照前及拍照后,因为拍照前不得开美颜?拍完后不得p图??...如果我们单独写一个拍照的类, 那要增加这些东西是肯定需要修改代码的, 且不利于复用, 你看有些天生丽质的, 就不需要这么些乱七八糟, 只要拍照就行, 那为了我们的程序可扩展性更强, 我们这边使用装饰器模式来实现一下吧...; } } /** * 设计装饰器的约束 只要是继承抽象的都应该拥有一个拍照对象, 你要装饰也要约束, 装饰的哪个方法?
在这个类中定义一个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)装饰器模式的本质
[设计模式] 装饰者模式 ? 手机用户请 横屏获取最佳阅读体验, REFERENCES中是本文参考的链接,如需要链接和更多资源,可以关注其他博客发布地址。...sinat_28690417 简书 https://www.jianshu.com/u/3032cc862300 个人博客 https://yiyuery.github.io/NoteBooks/ 装饰者模式...首先我们来分析下装饰者模式中有哪些角色: 装饰器:用于扩展被装饰者行为和特征 被装饰者:设计主体,一切的行为包装都为了丰富被装饰者的行为或是能力。 场景分析 朋友开了家畅饮吧,可以喝到不同种类的饮料。...,我们可以发现装饰模式是装饰器层层嵌套的一种设计模式,设计的主体就是被装饰者。...装饰者模式,动态地将责任附加到对象上,想要扩展功能,装饰者提供有别于继承的另一种选择 这种循环嵌套包装类的方式也可以理解为委托的方式,通过组合和委托,可以在运行时动态的添加新的行为 装饰者模式意味着有一群装饰器
装饰者模式:动态地将责任附加到对象上,若要扩展功能,装饰者提供了比继承更有弹性的替代方案。一言以蔽之 —— 动态扩展类的行为。...@Override public double cost() { return beverage.cost() + 0.20; } } 5、测试 测试类能帮你对装饰者模式有更清晰的认识...特点: 1、装饰者和被装饰者对象有相同的超类型。 2、你可以用一个或多个装饰者包装一个对象。 ...3、装饰者可以在所委托的被装饰者行为之前或之后,加上自己的行为,以达到特定的目的。 4、对象可以在任何时候被装饰,所以你可以在运行时动态地、不限量的用你喜欢的装饰者来装饰对象。...优点:装饰者模式的设计具有弹性,可以应对改变,可以接受新的功能来应对改变的需求。 缺点:如果每个地方都采用开放-封闭原则是一种浪费,也没必要,还会导致代码变得复杂且难以理解。比如会产生很多的小类。
---- 重点来了 装饰者设计模式 装饰者模式定义 装饰者模式:动态的将新功能附加到对象上。...在对象功能扩展方面,它比继承更有弹性,装饰者模式也体现了开闭原则(ocp) 原理图: 说明: 装饰者模式原理 装饰者模式就像是打包快递 主体 比如:衣服 、水果 属于被装饰者 Component 包装...好了装饰者设计模式的理论知识差不多了,我们来解决一下一开始的咖啡问题吧。...接下来给大家讲一讲装饰者模式在JDK源码中的应用吧。 不知道大家是否熟悉Java的IO结构,里面的FileInputStream就是一个装饰者。...分析得出在jdk 的io体系中,就是使用装饰者模式 ---- okay 到这里关于装饰者设计模式的应用案例以及源码分析讲到这里就已经结束了,不知看完这篇文章的你是否有所收获。
public void draw() { console,writeline("Shape : Circle") } } // step3: 创建实现了 Shape 接口的抽象装饰类...ShapeDecorator.cs // 为何此处用抽象装饰类?? // 这一步在此处有些多余。...step4 public abstract class ShapeDecorator : Shape { protected Shape decoratedShape // 传入实体类,来被装饰...RedShapeDecorator.cs // 在装饰类中,被装饰对象作为构造函数的 参数 传入 public class RedShapeDecorator : ShapeDecorator {...() { decoratedShape.draw(); // 先调用对象的原方法 setRedBorder(decoratedShape); // 给对象添加 装饰方法
四、装饰器模式 装饰器模式,希望在不改变原对象的基础上,通过对其拓展功能和属性来实现更复杂的逻辑 1、装饰器模式例子 假设有一家店在卖一种车,价格为10万元,如果用户需要在此基础上加装一些配置则需要加钱...addAutoMirror() console.log(car1.price) // 12.8 // 装饰器模式...title>Document function Car() { this.price = 10; } // 装饰器模式减少了对构造函数的操作
装饰者模式可以做到在不修改任何底层代码的情况下,给对象增加的新的方法。 首先,我们通过对一个现实问题的模拟分析,了解什么是装饰者模式以及装饰者模式的作用。 ---- 问题提出 咖啡店在街头随处可见。...引出装饰者模式 让我们转换思路,我们以饮品beverage为主体,在运行时以顾客选择的调料来装饰beverage。...这样就是实现的装饰者模式解决这个问题的思路。 下面我们看一下装饰者模式的定义,以及代码实现的基本思路 定义装饰者模式 装饰者模式动态的将责任附加到对象上。...这符合我们之前提到的设计原则多用组合,少用继承 实现装饰者模式 如果看到这里还是不太清楚,也没关系,接下来我们将具体实现代码,对装饰者模式有一个直观根本的了解。...装饰者模式用到的技术主要有两种就是组合和委托,这帮助我们动态的在运行时加上新的行为。 装饰者模式意味着一群装饰者类,这些类用来包装装饰者。 装饰者和被装饰者类实际上具有相同类型的。
领取专属 10元无门槛券
手把手带您无忧上云