经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » 设计模式 » 查看文章
设计模式之(十)装饰模式(DECORATOR)
来源:cnblogs  作者:彭卫强  时间:2019/7/22 10:48:55  对本文有异议

  在购买了一个房子后,如果是毛坯房,肯定不合适直接入住的。需要对它进行装修:地面找平贴地砖、批墙贴墙纸、吊顶装订以及买需要的家具,住进去以后也可能根据需要再添加或者去掉一些家具或者修改一些东西。所以的这一切,都是为了住起来舒服,也就是更好试用这个房子。这个装修过程,基本上就是装饰模式需要做的事情。

  引申到软件方面,一个原有的功能,可能需要添加一些辅助功能才能更好的应用。为了更好的、更加灵活的处理这样的需要,根据日常针对此类功能很好的设计写法进行了抽象。看起来就是对原来的功能进行了一些包装一样。搞明白装饰模式要解决的问题场景后。我们先来看下这个模式的定义:

动态的给动向添加一些额外的职责,就添加功能来说,装饰模式比生成子类更加灵活。

  类图和组成元素

                                                

 (抽象组件类)Component:定义一个对象接口,可以给这个对象动态的添加职责;

 (具体组件类)ConreteComonent:定义一个对象,可以给这个对象添加职责。被装饰的原始类

 (抽象装饰着)Derocater:定义一个接口,并且继承 Component,而且拥有一个 Component 类型的属性。

 (具体装饰着)ConcreteDerocater:是具体的装饰着,也可以作为被装饰者来装饰。

示例

   为了更好的展示装饰模式的。这里举个例子加深理解。给一个警察添加装备来举例。一般都配置警棍,但是根据每次执行任务的不同,来配置相应的装备,看例子

  1. //警察 相当于 Component
  2. public interface Jingcha {
  3. public void addZhuangb();
  4. }
  5. //特警 相当于 ConcreteComponent
  6. public class TeJing implements Jingcha {
  7. @Override
  8. public void addZhuangb() {
  9. // TODO Auto-generated method stub
  10. System.out.println("警棍");
  11. }
  12. }
  13. //特警 相当于 ConcreteComponent 被装饰的原始类
  14. public class TeJing implements Jingcha {
  15. @Override
  16. public void addZhuangb() {
  17. // TODO Auto-generated method stub
  18. System.out.println("警棍");
  19. }
  20. }
  21. //装饰警察 相当于 Decorate,抽象的装饰器类
  22. public abstract class DecorateJingcha implements Jingcha {
  23. Jingcha jc = null;
  24. public DecorateJingcha(Jingcha jc){
  25. this.jc = jc;
  26. }
  27. @Override
  28. public abstract void addZhuangb();
  29. }
  30. //装饰类之一
  31. public class DecorateJingchaFDY extends DecorateJingcha {
  32. public DecorateJingchaFDY(Jingcha jc) {
  33. super(jc);
  34. // TODO Auto-generated constructor stub
  35. }
  36. @Override
  37. public void addZhuangb() {
  38. // TODO Auto-generated method stub
  39. jc.addZhuangb();
  40. System.out.println("防弹衣");
  41. }
  42. }
  43. //装饰类之一
  44. public class DecorateJingchaSQ extends DecorateJingcha {
  45. public DecorateJingchaSQ(Jingcha jc) {
  46. super(jc);
  47. // TODO Auto-generated constructor stub
  48. }
  49. @Override
  50. public void addZhuangb() {
  51. // TODO Auto-generated method stub
  52. jc.addZhuangb();
  53. System.out.println("手枪");
  54. }
  55. }
  56. //装饰类之一
  57. public class DecorateJingchaYSY extends DecorateJingcha {
  58. public DecorateJingchaYSY(Jingcha jc) {
  59. super(jc);
  60. // TODO Auto-generated constructor stub
  61. }
  62. @Override
  63. public void addZhuangb() {
  64. // TODO Auto-generated method stub
  65. jc.addZhuangb();
  66. System.out.println("夜视仪");
  67. }
  68. }
  1. 1 public class Client {
  2. 2 public static void main(String[] args) {
  3. 3 Jingcha jc = new TeJing();
  4. 4 //维护抗议游行秩序,只用警棍就可以
  5. 5 System.out.println("------维护抗议游行秩序,只用警棍就可以-------");
  6. 6 jc.addZhuangb();
  7. 7 //晚上维护抗议游行秩序
  8. 8 System.out.println("------晚上维护抗议游行秩序,需另外加上夜视仪-------");
  9. 9 DecorateJingcha yesy = new DecorateJingchaYSY(jc);
  10. 10 yesy.addZhuangb();
  11. 11 //处理恐怖袭击事件
  12. 12 System.out.println("------处理晚上恐怖袭击事件,要枪、防弹衣-------");
  13. 13 DecorateJingcha dch1 = new DecorateJingchaSQ(jc);
  14. 14 DecorateJingcha dch2 = new DecorateJingchaFDY(dch1);
  15. 15 dch2.addZhuangb();
  16. 16 }
  17. 17 }
  18. 18
  19. 19 -----------------------------执行效果------------------------------------
  20. 20 ------维护抗议游行秩序,只用警棍就可以-------
  21. 21 警棍
  22. 22 ------晚上维护抗议游行秩序,需另外加上夜视仪-------
  23. 23 警棍
  24. 24 夜视仪
  25. 25 ------处理晚上恐怖袭击事件,要枪、防弹衣-------
  26. 26 警棍
  27. 27 手枪
  28. 28 防弹衣

  通过例子看出来,装饰器模式可以很灵活的实现需要的功能。而且符合开闭原则。

分析此模式

   首先分析一下实现方面需要注意什么呢:

     一、装饰器类和被装饰器都是实现共同的接口,这样有个好处是装饰类也能作为被装饰类来进一步装饰。

             二、装饰器类和被装饰类除了要实现共同的接口外,装饰器类还应该有共同的接口。这里主要是引入被装饰的类所谓属性

             三、根据定义可以看出来,此模式比继承灵活。这主要体现在试用的是类的组合方式来调用。和继承比起来不用全部继承过来。

             四,装饰器一次尽量少实现功能。这样在调用的时候组合起来更加灵活。

        这个模式的有点是什么呢.? 比继承更加灵活;更加容易复用功能;简单继承关系,简化搞定类的定义。原始类虽然被装饰了,但是它本身并没有被该表,只是在类的外部进行修改。也有点类似给原始类加上了一些外壳。

  每个模式的出现都有一定的目的,这个模式的目的是什么?就是根据业务灵活组合对象,复用已有类实现功能需要。也可以理解为把有些复杂的功能简单化,分散化,运行时根据需要来组合使用。

        代理模式和这个模式在实现上非常的相似,这个在写代理模式的时候再详细分析下。装饰模式就写到这里了

原文链接:http://www.cnblogs.com/pengweiqiang/p/11183739.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号