文章目录

  • 什么是装饰者模式
  • 装饰者模式中的角色
  • 抽象构件(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 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了相关推荐

  1. 通俗易懂,值得收藏的 java 设计模式实战,装饰者模式 之 你不用改变,就让你的能力变强了

    非常感谢你阅读本文,欢迎[

  2. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  3. Java 设计模式之装饰者模式

    一.了解装饰者模式 1.1 什么是装饰者模式 装饰者模式指的是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能.它是通过创建一个包装对象,也就是装饰者来包裹真实的对象. 所以装饰者可以动 ...

  4. Java设计模式之三--装饰者模式

    转载出处:http://blog.csdn.NET/lmj623565791/article/details/24269409 今天继续设计模式之旅,给大家带来装饰者模式,国际惯例,先看定义. 装饰者 ...

  5. (设计模式七)java设计模式之装饰器模式

    一.简介: 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构.这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装.这种模式创建了一个装饰类 ...

  6. java设计模式之 装饰器模式

    装饰器模式 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构. 这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装. 这种模式创建了一个装 ...

  7. java设计模式之装饰器模式(包装器模式)

    显然设计模式往往追求开闭原则,所以往往是面向接口编程,那么万事万物就是先写接口,把需求弄出来,这里以一辆车子在陆地上跑为基础,对它进行装饰,使它可以具备更多的"功能",达到装饰的效 ...

  8. java设计模式之装饰器模式

    一.装饰器模式简介 装饰器模式可以动态给一个对象添加一些额外的职责,同时又不改变其结构.就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活.这种模式创建了一个装饰 ...

  9. Java 设计模式之装饰器模式

    装饰器模式用于给原有对象增加新功能的场景, 拿食物冰淇淋,香草巧克力作为例子,给冰淇淋加香草,或者加巧克力,或者加香草和巧克力. 首先定义一个食物接口: /*** 装饰类和被装饰类共同继承的抽象类* ...

最新文章

  1. Fast-SCNN的解释以及使用Tensorflow 2.0的实现
  2. r240显卡 linux,NV发布260.19.36正式版Linux驱动 270系列将至
  3. 关于JAVA的参数列表传值的问题
  4. 【 MATLAB 】逆离散余弦变换(idct)的基础知识介绍
  5. python3 语言翻译相关库
  6. mysql限制小数位_Mysql中设置小数点用什么数据类型 decimal
  7. python爬虫图片-python爬虫(爬取图片)
  8. 【天池赛事】零基础入门语义分割-地表建筑物识别 Task6:分割模型模型集成
  9. 三电平igbt死区时间计算_基于大功率三电平IGBT模块并联的参考设计
  10. java编译系统资源不足_Ant编译项目资源不足
  11. java is a like a_小猿圈java之is-a、have-a和like-a的区别
  12. 基于STM32的小说阅读器
  13. 【PC】如何让程序开机自启动/如何打开开机自启动文件夹
  14. pval(pval胶水可以粘塑料吗)
  15. 计算机操作系统-4-设备管理
  16. 格拉姆矩阵(Gram matrix)详细解读
  17. 路由器自身拥有IP地址吗?
  18. 「2019纪中集训Day23」解题报告
  19. /usr/local
  20. TestNG监听器实现失败自动截图、重跑、自定义html结果文件功能

热门文章

  1. 视频文件的srt字幕 文件
  2. matlab合理分配席位_席位分配问题的Dhondt模型和相对尾数模型 -
  3. 什么是堆栈追踪(StackTrace)?如何利用StackTrace对程序进行调试?
  4. Docker#Docker当做虚拟机使用
  5. oracle删除语句
  6. HTML+CSS培训教案(一)
  7. mysql访问控制列表acl_Linux访问控制列表(Access Control List,简称ACL)
  8. mysql revoke select from,MySQL的SQL语句 - 数据库管理语句 - 账户管理语句 - REVOKE 语句...
  9. springboot启动类扫描路径
  10. 基于LD3320的语音识别模块LD-V7使用记录