首页
学习
活动
专区
工具
TVP
发布

装饰模式

这种给对象动态地增加职责的方式称为装饰(decorator)模式。装饰模式能够在不改变对象自身的基础上,在程序运行期间给对象动态地添加职责。...跟继承相比,装饰是一种更轻便灵活的做法,这是一种“即用即付”的方式,比如天冷了就多穿一件外套,需要飞行时就在头上插一支竹蜻蜓。 面向对象的装饰 假如你现在现在在写一个打飞机游戏。...因为装饰对象和它所装饰的对象拥有一致的接口,所以它们对使用该对象的客户来说是透明的,被装饰的对象也并不需要了解它曾经被装饰过,这种透明性使得我们可以递归地嵌套任意多个装饰对象。...装饰模式的作用就是为对象动态加入行为。换句话说,代理模式强调一种关系(Proxy与它的实体之间的关系),这种关系在一开始就可以被确定。而装饰模式用于一开始不能确定对象的全部功能时。...代理模式通常只有一层代理本体的引用,而装饰模式经常会形成一条长长的装饰链。

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

装饰模式

装饰器模式 动态地给一个对象添加一些额外的职责,装饰器模式就是基于对象组合的方式,可以很灵活的给对象添加所需要的功能。装饰器模式的本质就是动态组合。...装饰器模式意图和结构 装饰模式提供了一种给类增加功能的方法,它通过动态组合可以给原有的代码新增加新的代码,达到修改现有代码的目的,因此我们可以用在修复bug上。...装饰模式主要有Component、ConcreteComponent、Decorator和ConcreteDecorator组成。  ...具体组件角色(ConcreteComponent) :被装饰,定义一个将要被装饰增加功能的类。可以给这个类的对象添加一些职责。  ...ConcreteDecoratorA(c1); decoratorA.operation(); } } 总结 使用装饰模式应注意以下几点: 接口的一致性:装饰器对象的接口必须与它所装饰的Component

45480

装饰模式

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

36950

装饰模式

装饰模式进阶 透明与半透明的装饰模式 透明的装饰模式:要求客户端完全针对抽象编程(依赖倒置原则),装饰模式的透明型要求客户端程序不应该声明具体构件类型和具体装饰类型,而应该全部声明为抽象构件类型...:允许用户在客户端声明具体装饰类型的对象,允许在具体装饰中新增方法且客户端可以调用这些新增的方法。...抽象装饰角色:FilterInputStream,实现了抽象构件角色,且成为具体装饰的父类。...这里的装饰模式大多都是半透明的,具体装饰提供了比抽象构件多的方法,客户端可以使用这些方法。...装饰模式的简化 装饰有3种简化模式: 第一种情况,只有一个具体装饰,这样就不需要抽象装饰,具体装饰直接继承抽象构件就可以了。

22740

装饰模式

在23种设计模式中,装饰模式在游戏开发的过程中,使用的很是频繁。因为这个设计模式,把所有的业务的逻辑封装的对应的实体类中,从而为主流程减负了。...首先看下一个应用场景 装饰模式的应用 我们都知道有一款经典游戏90坦克,这个游戏中,玩家坦克来操作坦克打击AI敌人,在没打死一个红色坦克就会掉下来一个装备,这个装备可以提升移动速度,增加攻击力。...装饰实现流程图 ? 装饰实现逻辑 经过上面的分析,我们可以使用代码来表示我们的设计。...在java 中,IO的实现逻辑就是装饰模式 ,首先看下IO的逻辑类图: ?...知道了装饰模式,我们就可以更好的使用IO的类。

65540

装饰模式

一句话总结 通过继承自同一父类,来实现给某一个类动态的添加新的职责,原理是每一个装饰持有被装饰的实例,并可以用自身替代他....首先,将咖啡,茶等饮料定义为被装饰,奶,糖,椰果,珍珠等定义为装饰,当用户下单时,用户购买了一个”被装饰”以及若干个“装饰”,我们只需要将奶,糖,椰果,珍珠等东西装饰在被用户购买的这个被装饰上即可...”类 其实在这里有一问题,装饰和被装饰同样继承自Component,为什么被装饰直接继承,而装饰却还需要再写一个子类呢?...而使用装饰模式,可以很轻松的处理各种附加要求. 特点 通过上面的例子,我们可以总结一下装饰模式的特点。 (1)装饰和被装饰有相同的接口(或有相同的父类)。...(2)装饰保存了一个被装饰的引用。 (3)装饰接受所有客户端的请求,并且这些请求最终都会返回给被装饰(参见韦恩图)。 (4)在运行时动态地为对象添加属性,不必改变对象的结构。

35720

装饰模式

---- 重点来了 装饰设计模式 装饰模式定义 装饰模式:动态的将新功能附加到对象上。...在对象功能扩展方面,它比继承更有弹性,装饰模式也体现了开闭原则(ocp) 原理图: 说明: 装饰模式原理 装饰模式就像是打包快递 主体 比如:衣服 、水果 属于被装饰 Component 包装...(是具体的主体,比如前面讲到的单品coffee) Decorator(装饰 比如 调料):这里面聚合和Component(它是一个父类,我们可以放一个具体的子类 装饰包含被装饰) 在如图的Component...(具体装饰) 而这个FilterInputStream(装饰)中有一个属性InputStream,(被装饰) 简单总结: InputStream 是抽象类, 类似我们前面讲的 Drink FileInputStream...in; 即含被装饰 分析得出在jdk 的io体系中,就是使用装饰模式 ---- okay 到这里关于装饰设计模式的应用案例以及源码分析讲到这里就已经结束了,不知看完这篇文章的你是否有所收获。

10220

装饰模式.

装饰模式:动态地将责任附加到对象上,若要扩展功能,装饰提供了比继承更有弹性的替代方案。一言以蔽之 —— 动态扩展类的行为。...4、具体装饰(ConcreteDecorator):继承或实现抽象装饰,负责给组件对象"贴上"附加的责任。...Override public double cost() { return 0.89; } } 这是两个具体组件角色 —— 浓缩咖啡类和混合饮料类,用来接受附加责任,也就是装饰具体要装饰的类...特点:   1、装饰和被装饰对象有相同的超类型。   2、你可以用一个或多个装饰包装一个对象。   ...3、装饰可以在所委托的被装饰行为之前或之后,加上自己的行为,以达到特定的目的。   4、对象可以在任何时候被装饰,所以你可以在运行时动态地、不限量的用你喜欢的装饰装饰对象。

37040

装饰模式

首先我们来分析下装饰模式中有哪些角色: 装饰器:用于扩展被装饰行为和特征 被装饰:设计主体,一切的行为包装都为了丰富被装饰的行为或是能力。 场景分析 朋友开了家畅饮吧,可以喝到不同种类的饮料。...所有的被装饰(饮料)都继承该对象。...装饰器根据传入的被装饰,充当中间代理,对外提供被装饰的信息。...每个被包裹的装饰器对象都继承自抽象定义的装饰器 BeverageDecorator。 装饰器修饰的是被装饰装饰后,本身主体还是被装饰,所以每个装饰器都会把被装饰传入。...装饰模式,动态地将责任附加到对象上,想要扩展功能,装饰提供有别于继承的另一种选择 这种循环嵌套包装类的方式也可以理解为委托的方式,通过组合和委托,可以在运行时动态的添加新的行为 装饰模式意味着有一群装饰

26110

设计模式之装饰模式(Decorator Pattern)问题提出引出装饰模式定义装饰模式实现装饰模式总结与分析

装饰模式可以做到在不修改任何底层代码的情况下,给对象增加的新的方法。 首先,我们通过对一个现实问题的模拟分析,了解什么是装饰模式以及装饰模式的作用。 ---- 问题提出 咖啡店在街头随处可见。...这样就是实现的装饰模式解决这个问题的思路。 下面我们看一下装饰模式的定义,以及代码实现的基本思路 定义装饰模式 装饰模式动态的将责任附加到对象上。...上面有一个非常关键的地方,就是我们注意到装饰和被装饰必须是一样的类型,也就是拥有共同的超类。这样做是因为我们要装饰必须能取代被装饰。...装饰模式用到的技术主要有两种就是组合和委托,这帮助我们动态的在运行时加上新的行为。 装饰模式意味着一群装饰类,这些类用来包装装饰装饰和被装饰类实际上具有相同类型的。...装饰可以在被装饰的行为前面或后面加上自己的行为,甚至完全覆盖。 但装饰模式的使用会导致出现很多小对象,就是装饰对象,过度使用也会使程序变得复杂。

45640

装饰模式浅析

装饰模式是一种对象结构型模式,其意图是动态地给一个对象添加一些额外的职责。 一、装饰模式的基本介绍 1.1 意图 动态地给一个对象添加额外的职责。 1.2 结构 装饰模式的基本结构如下: ?...二、装饰模式示例 西游记中的孙悟空,具有七十二般变化,给我们留下了深刻的印象,他的每一种变化都给他带来了一种新的本领。他变成鱼儿时,就可以到水里游泳;他变成雀儿,就可以在天上飞行。...下面我们就以齐天大圣的例子来完成一个装饰模式的例子: ?...3.2 优点 vs 缺点 优点 装饰模式与继承关系的目的都是扩展对象的功能,但是装饰模式可以提供比继承更多的灵活性。装饰模式允许系统动态地决定“贴上”一个需要的“装饰”,或者去除一个不需要的“装饰”。...装饰模式不试图在一个复杂的可定制的类中支持所有可预见的特性。相反你可以定义一个简单的类,并且使用Decorator类给它逐渐的添加功能。可以从一个简单的部件组合出复杂的功能。

44310

java装饰模式

首次知道装饰模式还是学生时期,装饰听起来就是被装饰的事物被裹了一层功能,可以动态的给被装饰的事物增加一个或多个功能或当不需要时可以动态的去掉增加的装饰功能。...public interface Sourceable { /** * 原始的方法 */ void original(); } 首先,我们先定义一个接口,然后被装饰装饰分别实现这个接口...{ System.out.println("原始的dool"); } } 这里,我们定义一个名为Dool的类实现Soourceable这个接口,然后重写接口的方法,后面我们的装饰同样实现这个接口...sourceable.original(); System.out.println("对门再次进行修饰"); } } 由于Dool这个类需要被修饰,所以在装饰里面添加了...,这就是要分享的装饰模式,今天的文章就到这里结束了,你喜欢阅读,我喜欢分享。

35630

装饰模式(Decorator)

装饰模式(Decorator) 装饰模式(Decorator)[Wrapper] 意图:动态的给一个对象添加一些额外的职责,就增加功能来说,比生成子类更为灵活。 应用:给GUI组件添加功能等。...另外为了完成装饰的目的,装饰器需要包含被装饰的对象,装饰器不直接包含被装饰对象,而是包含它们统一接口的引用,这样通过多态机制可以实现多层装饰。...装饰器为被装饰对象添加功能通过调用被装饰对象的统一接口实现,如果装饰器需要复杂的扩展,我们通过继承装饰器实现具体的装饰器(ConcreteDecorator),具体的装饰器可以扩展数据(addedState...ConcreteDecorator( new ConcreteComponent()     )); coutoperation().c_str()<<endl; delete pac; 从使用装饰模式的代码来看...,装饰器对对象的操作就像包装一样,一层层的为对象扩展功能,而且装饰装饰后的对象仍然可以被装饰

46370

设计模式-装饰模式

装饰模式又叫包装模式,他能够以透明的方式扩展对象的功能,是继承方式的另外一种替代方案。...和代理模式很相似,但在对被装饰的对象的控制程度是不同的;装饰模式是对对象功能的加强,而代理模式是对对象施加控制,并不提供对对象本身功能的加强。 首先看下装饰模式的类图 ?...说明下: Component,给出一个抽象接口,规范实现类的一些方法; ConcreteComponent:具体的一个组件,实现了接口方法; Decorator:抽象的装饰,对接口的一个引用,在 method...方法里面使用这个引用完成任务;(代理模式需要实例化) ConcreteDecorator:具体的装饰,对抽象装饰的抽象部分进行实现 下面给出实现代码 抽象组件接口: public interface...装饰模式可以演变一种更加直观的,就是没有 Component 抽象组件,抽象装饰直接继承某个类,对这个类进行装饰。 还可以把抽象装饰与具体装饰合二为一,对功能简单的可以这样优化处理。

44731

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券