查看: 46|回复: 2

JAVA设计模式初探之装饰者模式

[复制链接]
新浪微博达人勋 sj_ 实名认证
论坛徽章:
3
机器学习徽章
日期:2018-03-29 16:05:00Git徽章
日期:2018-06-07 16:21:59股票徽章
日期:2018-06-29 11:14:50
发表于 2018-7-9 18:54 | 显示全部楼层 |阅读模式

Java

定义:动态给一个对象添加一些额外的职责,就象在墙上刷油漆.使用Decorator模式相比用生成子类方式达到功能的扩充显得更为灵活。
设计初衷:通常可以使用继承来实现功能的拓展,如果这些需要拓展的功能的种类很繁多,那么势必生成很多子类,增加系统的复杂性,同时,使用继承实现功能拓展,我们必须可预见这些拓展功能,这些功能是编译时就确定了,是静态的。

 

 要点: 装饰者与被装饰者拥有共同的超类,继承的目的是继承类型,而不是行为


   实际上Java 的I/O API就是使用Decorator实现的。

 

  1. //定义被装饰者
  2. public interface Human {
  3. public void wearClothes();
  4. public void walkToWhere();
  5. }
  6. //定义装饰者
  7. public abstract class Decorator implements Human {
  8. private Human human;
  9. public Decorator(Human human) {
  10. this.human = human;
  11. }
  12. public void wearClothes() {
  13. human.wearClothes();
  14. }
  15. public void walkToWhere() {
  16. human.walkToWhere();
  17. }
  18. }
  19. //下面定义三种装饰,这是第一个,第二个第三个功能依次细化,即装饰者的功能越来越多
  20. public class Decorator_zero extends Decorator {
  21. public Decorator_zero(Human human) {
  22. super(human);
  23. }
  24. public void goHome() {
  25. System.out.println("进房子。。");
  26. }
  27. public void findMap() {
  28. System.out.println("书房找找Map。。");
  29. }
  30. @Override
  31. public void wearClothes() {
  32. // TODO Auto-generated method stub
  33. super.wearClothes();
  34. goHome();
  35. }
  36. @Override
  37. public void walkToWhere() {
  38. // TODO Auto-generated method stub
  39. super.walkToWhere();
  40. findMap();
  41. }
  42. }
  43. public class Decorator_first extends Decorator {
  44. public Decorator_first(Human human) {
  45. super(human);
  46. }
  47. public void goClothespress() {
  48. System.out.println("去衣柜找找看。。");
  49. }
  50. public void findPlaceOnMap() {
  51. System.out.println("在Map上找找。。");
  52. }
  53. @Override
  54. public void wearClothes() {
  55. // TODO Auto-generated method stub
  56. super.wearClothes();
  57. goClothespress();
  58. }
  59. @Override
  60. public void walkToWhere() {
  61. // TODO Auto-generated method stub
  62. super.walkToWhere();
  63. findPlaceOnMap();
  64. }
  65. }
  66. public class Decorator_two extends Decorator {
  67. public Decorator_two(Human human) {
  68. super(human);
  69. }
  70. public void findClothes() {
  71. System.out.println("找到一件D&G。。");
  72. }
  73. public void findTheTarget() {
  74. System.out.println("在Map上找到神秘花园和城堡。。");
  75. }
  76. @Override
  77. public void wearClothes() {
  78. // TODO Auto-generated method stub
  79. super.wearClothes();
  80. findClothes();
  81. }
  82. @Override
  83. public void walkToWhere() {
  84. // TODO Auto-generated method stub
  85. super.walkToWhere();
  86. findTheTarget();
  87. }
  88. }
  89. //定义被装饰者,被装饰者初始状态有些自己的装饰
  90. public class Person implements Human {
  91. @Override
  92. public void wearClothes() {
  93. // TODO Auto-generated method stub
  94. System.out.println("穿什么呢。。");
  95. }
  96. @Override
  97. public void walkToWhere() {
  98. // TODO Auto-generated method stub
  99. System.out.println("去哪里呢。。");
回复

使用道具 举报

论坛徽章:
1
QT徽章
日期:2018-01-18 17:59:27
发表于 2018-7-9 21:06 | 显示全部楼层
装饰器模式其实就是在类中关联另外同属一个父类的对象,然后通过不断的对该对象进行额外的操作就能达到装饰的功能
回复 支持 反对

使用道具 举报

论坛徽章:
33
python徽章
日期:2014-09-23 14:45:41机器学习徽章
日期:2017-03-30 17:23:20推荐系统徽章
日期:2017-04-13 17:34:54python徽章
日期:2017-05-11 17:15:13spark徽章
日期:2017-05-18 16:16:45spark徽章
日期:2017-05-25 16:46:51Excel徽章
日期:2017-06-15 17:34:13高并发架构徽章
日期:2017-07-27 17:30:17Tomcat徽章
日期:2017-08-03 18:16:45大型分布式徽章
日期:2017-09-04 17:20:56python徽章
日期:2017-10-26 15:10:47Kaggle徽章
日期:2017-12-25 17:28:27
发表于 2018-7-13 09:24 | 显示全部楼层
感觉是一个比较简单的子类继承父类,看过其它一些模式,感觉设计模式不好学.
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

 

GMT+8, 2018-7-23 19:51 , Processed in 0.234485 second(s), 37 queries .

关闭

扫一扫加入
本版微信群