图1 装饰者模式【点击查看图片】

1,一个简单的以人为主体的装饰者模式

被装饰者

  1. public interface Human {//被装饰者
  2. public void wearClothes();
  3. public void walkToWhere();
  4. }
  5.  
  6. //定义被装饰者,被装饰者初始状态有些自己的装饰
  7. class Person implements Human {
  8.  
  9. @Override
  10. public void wearClothes() {
  11. // TODO Auto-generated method stub
  12. System.out.println("穿什么呢。。");
  13. }
  14.  
  15. @Override
  16. public void walkToWhere() {
  17. // TODO Auto-generated method stub
  18. System.out.println("去哪里呢。。");
  19. }
  20. }

装饰者

  1. public abstract class Decorator implements Human {//定义装饰者
  2. private Human human;
  3.  
  4. public Decorator(Human human) {//有参构造
  5. this.human = human;
  6. }
  7.  
  8. @Override
  9. public void wearClothes() {
  10. human.wearClothes();
  11. }
  12.  
  13. @Override
  14. public void walkToWhere() {
  15. human.walkToWhere();
  16. }
  17. }
  18.  
  19. class Decorator_zero extends Decorator {
  20.  
  21. public Decorator_zero(Human human) {
  22. super(human);
  23. }
  24.  
  25. public void goHome() {
  26. System.out.println("进房子。。");
  27. }
  28.  
  29. public void findMap() {
  30. System.out.println("书房找找Map。。");
  31. }
  32.  
  33. @Override
  34. public void wearClothes() {
  35. // TODO Auto-generated method stub
  36. super.wearClothes();
  37. goHome();
  38. }
  39.  
  40. @Override
  41. public void walkToWhere() {
  42. // TODO Auto-generated method stub
  43. super.walkToWhere();
  44. findMap();
  45. }
  46. }
  47.  
  48. class Decorator_first extends Decorator {
  49.  
  50. public Decorator_first(Human human) {
  51. super(human);
  52. }
  53.  
  54. public void goClothespress() {
  55. System.out.println("去衣柜找找看。。");
  56. }
  57.  
  58. public void findPlaceOnMap() {
  59. System.out.println("在Map上找找。。");
  60. }
  61.  
  62. @Override
  63. public void wearClothes() {
  64. // TODO Auto-generated method stub
  65. super.wearClothes();
  66. goClothespress();
  67. }
  68.  
  69. @Override
  70. public void walkToWhere() {
  71. // TODO Auto-generated method stub
  72. super.walkToWhere();
  73. findPlaceOnMap();
  74. }
  75. }
  76.  
  77. class Decorator_two extends Decorator {
  78.  
  79. public Decorator_two(Human human) {
  80. super(human);
  81. }
  82.  
  83. public void findClothes() {
  84. System.out.println("找到一件D&G。。");
  85. }
  86.  
  87. public void findTheTarget() {
  88. System.out.println("在Map上找到神秘花园和城堡。。");
  89. }
  90.  
  91. @Override
  92. public void wearClothes() {
  93. // TODO Auto-generated method stub
  94. super.wearClothes();
  95. findClothes();
  96. }
  97.  
  98. @Override
  99. public void walkToWhere() {
  100. // TODO Auto-generated method stub
  101. super.walkToWhere();
  102. findTheTarget();
  103. }
  104. }

测试验证

  1. public class Client {
  2. public static void main(String[] args) {
  3. Human person = new Person();
  4. Decorator decorator = new Decorator_two(new Decorator_first(new Decorator_zero(person)));
  5.  
  6. decorator.wearClothes();
  7. decorator.walkToWhere();
  8. }
  9. }

2,一个以汉堡添为主体的装饰者模式

被装饰者

  1. public abstract class Humburger {//被装饰者,主体,被修补的物件
  2. protected String name ;
  3. public String getName(){
  4. return name;
  5. }
  6. public abstract double getPrice();
  7.  
  8. }
  9.  
  10. class ChickenBurger extends Humburger {//被修饰者的原始状态
  11. public ChickenBurger(){
  12. name = "鸡腿堡";
  13. }
  14. @Override
  15. public double getPrice() {
  16. return 10;
  17. }
  18. }

装饰者

  1. public abstract class Condiment extends Humburger {//装饰者【修修补补的材料】
  2. public abstract String getName();
  3. }
  4.  
  5. class Lettuce extends Condiment {
  6. Humburger humburger;
  7. public Lettuce(Humburger humburger){
  8. this.humburger = humburger;
  9. }
  10. @Override
  11. public String getName() {
  12. return humburger.getName()+" 加生菜";
  13. }
  14. @Override
  15. public double getPrice() {
  16. return humburger.getPrice()+1.5;
  17. }
  18. }
  19.  
  20. class Chilli extends Condiment {
  21. Humburger humburger;
  22. public Chilli(Humburger humburger){
  23. this.humburger = humburger;
  24. }
  25. @Override
  26. public String getName() {
  27. return humburger.getName()+" 加辣椒";
  28. }
  29. @Override
  30. public double getPrice() {
  31. return humburger.getPrice(); //辣椒是免费的哦
  32. }
  33.  
  34. }

测试验证

  1. public class Client {
  2. public static void main(String[] args) {
  3. Humburger humburger = new ChickenBurger();//鸡腿堡 价钱:10.0
  4. System.out.println(humburger.getName()+" 价钱:"+humburger.getPrice());
  5.  
  6. Lettuce lettuce = new Lettuce(humburger);//鸡腿堡 加生菜 价钱:11.5
  7. System.out.println(lettuce.getName()+" 价钱:"+lettuce.getPrice());
  8.  
  9. Chilli chilli = new Chilli(humburger);//鸡腿堡 加辣椒 价钱:10.0
  10. System.out.println(chilli.getName()+" 价钱:"+chilli.getPrice());
  11.  
  12. Chilli chilli2 = new Chilli(lettuce);//鸡腿堡 加生菜 加辣椒 价钱:11.5
  13. System.out.println(chilli2.getName()+" 价钱:"+chilli2.getPrice());
  14. }
  15.  
  16. }

参考:https://blog.csdn.net/jason0539/article/details/22713711

Java装饰者模式(思维导图)的更多相关文章

  1. [Java 并发] Java并发编程实践 思维导图 - 第一章 简单介绍

    阅读<Java并发编程实践>一书后整理的思维导图.

  2. [Java 并发] Java并发编程实践 思维导图 - 第二章 线程安全性

    依据<Java并发编程实践>一书整理的思维导图.

  3. [Java 并发] Java并发编程实践 思维导图 - 第四章 对象的组合

    依据<Java并发编程实践>一书整理的思维导图. 第一部分: 第二部分:

  4. 学习Java的9张思维导图

    转自:https://blog.csdn.net/aitaozi11/article/details/79652943 网上搜集了java的学习思维导图,分享给大家. 01.Java程序设计(基础) ...

  5. Java Web学习过程的思维导图

    今天找文件,无意中翻到老师前段时间总结的知识点.觉得应该有点用处,所以分享给大家. 第一次在博客园发表,如有错误,还请指正.

  6. java编程思想-泛型思维导图

  7. java编程思想-并发思维导图

  8. java编程思想-注解思维导图

  9. Java基础知识学习思维导图

  10. 思维导图学《On Java》基础卷

    说明 原来读过 <Java 编程思想(第 4 版)>,但是这个版本还是基于 Java 5 讲解.由于 Java 8 做出了非常大的改进(是 Java 变化最大的版本),且截止到 2022- ...

随机推荐

  1. 攻防世界RE1 writeup

    解题过程 将题目给出的exe文件拖入ida中,查看main函数. 分析函数的逻辑,发现用户需要输出一个字符串,存储到变量v9中.如果v9的值与v5的值相等则会打印unk_413e90中的值,否则打印a ...

  2. pod package 生成 Framework

    pod package 生成 Framework pod package 是 cocoapods 的一个插件,如果没有的话使用以下命令安装: sudo gem install cocoapods-pa ...

  3. 多线程循环打印ABC

    主要是利用线程的wait()和notify()来实现 public class MyThread implements Runnable { private String name; private ...

  4. Flutter移动电商实战 --(35)列表页_上拉加载更多制作

    右侧列表上拉加载配合类别的切换 上拉加载需要一个page参数,当点击大类或者小类的时候,这个page就要变成1 provide内定义参数 首先我们需要定义一个page的变量 下图是我们之前在首页的时候 ...

  5. pycharm2019没有database问题(关于社区版)

    原文链接:https://blog.csdn.net/BlacK_CaT_/article/details/53884806网上教程都是直接打开右上角的database,但是我死活也没找到,后来发现应 ...

  6. vsCode多选多个元素进行统一修改

    如果你没有修改过vsCode的快捷键那么你可以按住"ctrl+d",然后逐个选中你要修改的元素,选完之后松开,你就可以敲击键盘愉快的修改了...如果你使用了ecliplse快捷键插 ...

  7. TransitionDrawable

    ayerDrawable的一个子类,TransitionDrawable只管理两层的Drawable!两层!两层! 并且提供了透明度变化的动画,可以控制一层Drawable过度到另一层Drawable ...

  8. 图解centos7如何关闭ipv6仅使用ipv4

    方法/步骤     使用ifconfig命令查看网卡信息,如果出现inet6 fe80::20c:29ff:fed0:3514,说明机器开启了ipv6,如下图所示:   编辑/etc/sysctl.c ...

  9. smarty 对数据库的简单操作。

    smarty简单配置 -------------------------------------smarty_inc.php-------------------------------------- ...

  10. android studio 开发中启动android项目报错sdk版本不一致解决方案

    安卓项目开发中新建项目后再run'的时候发现报错com.android.support:appcompat-v7依赖报错 查看下build.gredle所配置的参数: 打开项目的build.gradl ...