软件设计模式之路-----装饰者模式
装饰者模式定义:装饰者模式动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方法。
装饰者模式是对原有功能增加新的功能(行为),当然,给一个类增加新功能(行为)我们可以使用继承或组合。但是单独的使用继承或组合实现将会产生大量的类,而使用装饰者模式可以在保持良好的扩展性同时避免产生大量的类。
优点:
- 装饰器是继承的有力补充,比继承灵活,在不改变原有对象的情况下,动态的给一个对象扩展功能,即插即用
- 通过使用不用装饰类及这些装饰类的排列组合,可以实现不同效果
- 装饰器模式完全遵守开闭原则
缺点:过度使用会产生很多子类
装饰者模式结构:
- 抽象构件(Component)角色:定义一个抽象接口以规范准备接收附加责任的对象。
- 具体构件(ConcreteComponent)角色:实现抽象构件,通过装饰角色为其添加一些职责。
- 抽象装饰(Decorator)角色:继承抽象构件,并包含具体构件的实例,可以通过其子类扩展具体构件的功能。
- 具体装饰(ConcreteDecorator)角色:实现抽象装饰的相关方法,并给具体构件对象添加附加的责任。
装饰者模式实现:
场景说明:构件为:LOL里面的英雄。装饰为LOL里面的装备。使用云顶之弈模式为为背景。
package com.wly.DesignPatterns;/*** @program: StudyDome* @author: yuanzhang* @create: 2020-12-02 15:29**/
public class Decorator {public static void main(String[] args) {System.out.println("获得一个英雄---泰隆");BaseRole shadowTalon = new ShadowTalon();System.out.println("-----------:"+shadowTalon.getEquipment());System.out.println("给他装个电刀");shadowTalon = new Electrotome(shadowTalon);System.out.println("-----------:"+shadowTalon.getEquipment());System.out.println("给它装个轻语");shadowTalon = new Whisper(shadowTalon);System.out.println("-----------:"+shadowTalon.getEquipment());}}
/*** @Annotation:抽象构件 -----角色* @Author: yuanzhang* @Date: 15:35*/
abstract class BaseRole{/** 获取装备*/protected abstract String getEquipment();
}
/*** @Annotation:具体构件----英雄泰隆* @Author: yuanzhang* @Date: 15:35*/
class ShadowTalon extends BaseRole{@Overrideprotected String getEquipment() {return "ShadowTalon";}
}
/*** @Annotation:抽象装饰----装备库* @Author: yuanzhang* @Date: 15:40*/
class EquipmentLibrary extends BaseRole{protected BaseRole role;EquipmentLibrary(BaseRole role){this.role = role;}@Overrideprotected String getEquipment() {return role.getEquipment()+"没装备";}
}
/*** @Annotation:具体装饰----电刀* @Author: yuanzhang* @Date: 15:47*/
class Electrotome extends EquipmentLibrary{Electrotome(BaseRole role) {super(role);}@Overrideprotected String getEquipment(){return role.getEquipment()+"|电刀";}
}
/*** @Annotation:具体装饰----最后的轻语* @Author: yuanzhang* @Date: 15:57*/
class Whisper extends EquipmentLibrary{Whisper(BaseRole role){super(role);}@Overrideprotected String getEquipment() {return role.getEquipment()+"|轻语";}
}
输出:
获得一个英雄---泰隆 -----------:ShadowTalon 给他装个电刀 -----------:ShadowTalon|电刀 给它装个轻语 -----------:ShadowTalon|电刀|轻语
软件设计模式之路-----装饰者模式相关推荐
- 软件设计模式之(二)装饰者模式
转载自 : http://blog.csdn.net/chenyujing1234 例子代码:(编译工具:Eclipse) http://www.rayfile.com/zh-cn/files/12 ...
- 设计模式学习笔记——装饰(Decorator)模式
设计模式学习笔记--装饰(Decorator)模式 @(设计模式)[设计模式, 装饰模式, decorator] 设计模式学习笔记装饰Decorator模式 基本介绍 装饰案例 类图 实现代码 Dis ...
- 设计模式之【装饰器模式】
和表妹去喝奶茶 表妹:哥啊,我想喝奶茶. 我:走啊,去哪里喝? 表妹:走,我带你去,我经常去的那家,不但好喝,还可以自由搭配很多小料.我每次都是不同的搭配,换着喝,嘻嘻. 我:你倒是挺会喝的嘛~ 你看 ...
- 通俗易通,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了
文章目录 什么是装饰者模式 装饰者模式中的角色 抽象构件(Component)角色 具体构件(Concrete Component)角色 装饰(Decorator)角色 具体装饰(Concrete D ...
- 设计模式 - 结构型 - 装饰者模式
2019独角兽企业重金招聘Python工程师标准>>> 介绍 意图:动态地给一个对象添加一些额外的职责.就增加功能来说,装饰器模式相比继承更为灵活. 主要解决:一般的,我们为了扩展一 ...
- 设计模式学习3——装饰者模式(Decorator)
没想到鼻炎还要做手术,这应该是出生到现在的第一个手术吧,据说是个小手术,呵呵,应该没有什么问题吧,不过得有10天左右的手术及休养时间,不知道设计模式的学习会不会被打断,嘿嘿. 装饰者模式 ...
- 设计模式篇——初探装饰器模式
文章目录 1.装饰器模式介绍 2.装饰器模式类图 3.装饰器模式Demo实现(一个小镇的拉面馆) 4.装饰器模式总结 装饰器模式介绍:装饰器模式可以在不修改任何底层代码的情况下,给对象赋予新的职责(程 ...
- Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- java中装饰器_Java设计模式12:装饰器模式
装饰器模式 装饰器模式又称为包装(Wrapper)模式.装饰器模式以多客户端透明的方式扩展对象的功能,是继承关系的一个替代方案. 装饰器模式的结构 通常给对象添加功能,要么直接修改对象添加相应的功能, ...
- 《设计模式》之装饰器模式
一.什么是装饰器模式 当需要对类的功能进行拓展时,一般可以使用继承,但如果需要拓展的功能种类很繁多,那势必会生成很多子类,增加系统的复杂性,并且使用继承实现功能拓展时,我们必须能够预见这些拓展功能,也 ...
最新文章
- FCKeditor 2.6 安装配置使用指南(asp)
- google us web
- 如何在while和for中使用ssh
- 笨办法学 Python · 续 练习 24:URL 快速路由
- 硬件工程师的基本技能
- OpenShift 4 - 用CA证书或Token访问Internal Registry中的容器
- 达摩院研发自动驾驶高精定位系统,无GPS信号也可实现厘米级定位
- python PPT学习资料分享
- 基于marlin固件的SCARA机器人
- python重试组件tenacity介绍
- G1垃圾回收日志分析
- 周易六十四卦—水泽节卦
- 超简单禁止迅雷下载!(分析+方法)
- odoo13-14电商插件
- music功能 vue_vue_music:歌手详情页
- 品牌声量是什么?怎么查询统计品牌声量?
- 甲级测绘资质审批常见问题-甲级测绘资质如何办理?
- Android FrameWork 学习之Android 系统源码调试
- Python数据标准化
- 浪潮信息m5服务器,浪潮英信服务器NF8480M5