通俗易通,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了
文章目录
- 什么是装饰者模式
- 装饰者模式中的角色
- 抽象构件(Component)角色
- 具体构件(Concrete Component)角色
- 装饰(Decorator)角色
- 具体装饰(Concrete Decorator)角色
- 测试的时候到了
- 尾声
什么是装饰者模式
网络百科如下:
装饰模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它是通过创建一个包装对象,也就是装饰来包裹真实的对象。
设计模式和编程语言无关,但是二当家的依然用Java语言去实战举例。
装饰者模式中的角色
- 抽象构件(Component)角色:给出一个抽象接口,以规范准备接收附加责任的对象。
- 具体构件(Concrete Component)角色:定义一个将要接收附加责任的类。
- 装饰(Decorator)角色:持有一个构件(Component)对象的实例,并实现一个与抽象构件接口一致的接口。
- 具体装饰(Concrete Decorator)角色:负责给构件对象添加上附加的责任。
抽象构件(Component)角色
用动物接口作为抽象构件(Component)角色,动物会移动,和咬。
package com.secondgod.decorator;/*** 动物** 抽象构件(Component)角色** @author */
public interface Animal {/*** 移动*/void move();/*** 咬你*/void bite();
}
具体构件(Concrete Component)角色
用会跑会咬的狗狗类作为具体构件(Concrete Component)角色。
package com.secondgod.decorator;/*** 狗** 具体构件(Concrete Component)角色** @author */
public class Dog implements Animal {@Overridepublic void move() {System.out.println("狗子跑起来吧。。。。。");}@Overridepublic void bite() {System.out.println("狗子生气了,咬你。。。。。");}
}
装饰(Decorator)角色
专门为动物设计了装备,可热插拔,牛得很。
package com.secondgod.decorator;/*** 动物装备** 装饰(Decorator)角色** @author */
public abstract class AnimalEquipment implements Animal {private Animal animal;public AnimalEquipment(Animal animal) {this.animal = animal;}@Overridepublic final void move() {beforeMove();animal.move();afterMove();}@Overridepublic final void bite() {beforeBite();animal.bite();afterBite();}/*** 移动前的能力增强*/protected abstract void beforeMove();/*** 移动后的能力增强*/protected abstract void afterMove();/*** 咬你前的能力增强*/protected abstract void beforeBite();/*** 咬你后的能力增强*/protected abstract void afterBite();
}
具体装饰(Concrete Decorator)角色
觉得狗狗跑得有点慢,于是设计了一件动物加速装备,不要太先进哦。
package com.secondgod.decorator;/*** 动物加速装备** 具体装饰(Concrete Decorator)角色** @author */
public class AnimalAcceleratorEquipment extends AnimalEquipment {public AnimalAcceleratorEquipment(Animal animal) {super(animal);}@Overrideprotected void beforeMove() {System.out.println("打开加速引擎。。。。。");}@Overrideprotected void afterMove() {System.out.println("关闭加速引擎。。。。。");}@Overrideprotected void beforeBite() {}@Overrideprotected void afterBite() {}
}
有的小动物会被大的动物欺负,于是为他们设计一款攻击力增强装备来保护自己,不要太猛哦。
package com.secondgod.decorator;/*** 动物保护装备** 具体装饰(Concrete Decorator)角色** @author */
public class AnimalProtectionEquipment extends AnimalEquipment{public AnimalProtectionEquipment(Animal animal) {super(animal);}@Overrideprotected void beforeMove() {}@Overrideprotected void afterMove() {}@Overrideprotected void beforeBite() {System.out.println("安装合金牙套。。。。。");}@Overrideprotected void afterBite() {System.out.println("取下合金牙套。。。。。");}
}
测试的时候到了
package com.secondgod.decorator;public class Test {public static void main(String[] args) {System.out.println("一只善良小狗子散步中。。。。。");Animal animal = new Dog();System.out.println("一只凶猛大狗出现,前来欺负善良小狗。。。。。");System.out.println("赶紧为善良小狗装上保护装备,反击的时候到了。。。。。");animal = new AnimalProtectionEquipment(animal);animal.bite();System.out.println("糟糕了,有点过了,跑路吧,小狗子移动太慢了,装上加速装备。。。。。");animal = new AnimalAcceleratorEquipment(animal);animal.move();}
}
好了,安全到家,Nice。
如果要是用继承的方式,要多出来很多类:加速不合金的狗子,合金不加速的狗子,又加速又合金的狗子,以后可能还要有加速不合金的猫,合金不加速的猫,又加速又合金的猫。
尾声
为了更明确的说明装饰者模式不增加或减少行为,而是行为的增强,所以装饰角色使用抽象类并且是final方法来举例,这样严格限制了具体装饰角色仅决定如何增强行为,而不改变行为的多少。事实上装饰角色也可以是接口。
装饰者模式太好用了,热插拔,你不用改变,就让你的能力变强了。
原文链接:https://blog.csdn.net/leyi520/article/details/119964287
通俗易通,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了相关推荐
- 通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了
非常感谢你阅读本文,欢迎[
- Java设计模式(装饰者模式-组合模式-外观模式-享元模式)
Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...
- Java 设计模式之装饰者模式
一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...
- Java设计模式之三--装饰者模式
转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...
- (设计模式七)java设计模式之装饰器模式
一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...
- java设计模式之 装饰器模式
装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...
- java设计模式之装饰器模式(包装器模式)
显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...
- java设计模式之装饰器模式
一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...
- Java 设计模式之装饰器模式
装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...
最新文章
- Fast-SCNN的解释以及使用Tensorflow 2.0的实现
- r240显卡 linux,NV发布260.19.36正式版Linux驱动 270系列将至
- 关于JAVA的参数列表传值的问题
- 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍
- python3 语言翻译相关库
- mysql限制小数位_Mysql中设置小数点用什么数据类型 decimal
- python爬虫图片-python爬虫(爬取图片)
- 【天池赛事】零基础入门语义分割-地表建筑物识别 Task6:分割模型模型集成
- 三电平igbt死区时间计算_基于大功率三电平IGBT模块并联的参考设计
- java编译系统资源不足_Ant编译项目资源不足
- java is a like a_小猿圈java之is-a、have-a和like-a的区别
- 基于STM32的小说阅读器
- 【PC】如何让程序开机自启动/如何打开开机自启动文件夹
- pval(pval胶水可以粘塑料吗)
- 计算机操作系统-4-设备管理
- 格拉姆矩阵(Gram matrix)详细解读
- 路由器自身拥有IP地址吗?
- 「2019纪中集训Day23」解题报告
- /usr/local
- TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能
热门文章
- 视频文件的srt字幕 文件
- matlab合理分配席位_席位分配问题的Dhondt模型和相对尾数模型 -
- 什么是堆栈追踪(StackTrace)?如何利用StackTrace对程序进行调试?
- Docker#Docker当做虚拟机使用
- oracle删除语句
- HTML+CSS培训教案(一)
- mysql访问控制列表acl_Linux访问控制列表(Access Control List,简称ACL)
- mysql revoke select from,MySQL的SQL语句 - 数据库管理语句 - 账户管理语句 - REVOKE 语句...
- springboot启动类扫描路径
- 基于LD3320的语音识别模块LD-V7使用记录