A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 郭帅帅 中级黑马   /  2014-3-26 14:28  /  1262 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

前提是先有一个类,这个类可能是以前别人定义的或者是自己定义的,过了一段时间之后发现它的功能不能满足当前的需求了。那么我们就需要对它的功能进行扩展或者说增强。当然我们不能改变源码;那么我们可以再定义一个类,并且将已有对象作为参数传入,基于已有的功能,并提供加强功能。
那么后来定义的增强功能的类就称为装饰类。这种设计思想就称为装饰设计模式。

下面举个例子来具体体现一下装饰设计模式,当然这是引用毕老师的经典案例!


  1. <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em">
  2. <BLOCKQUOTE>class Person{
  3.          public void chifan(){
  4.                  System.out.println("吃饭");
  5.       }
  6. }
  7. class SuperPerson{
  8.          private Person p;
  9.          SuperPerson(Person p){
  10.          this.p = p;
  11. }
  12.          public void superChifan(){
  13.          System.out.println("开胃酒");
  14.          p.chifan();
  15.                 System.out.println("甜点");
  16.                System.out.println("抽烟");
  17.       }
  18. }
  19. public class PersonDemo {
  20. <P></P>
  21. <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em">public static void main(String[] args){
  22.        Person p = new Person();
  23.        SuperPerson sp = new SuperPerson(p);
  24.         sp.superChifan();
  25.        }
  26. }</P>
复制代码

首先Person类就是原先定义的类,我们可以这样理解:作为人要是生活在解放前的话,我们只有吃饭这一行为,仅为了填报肚子。因为那时候穷嘛,没办法。不过到了改革开放后,人民生活水平提高了,人们开始享受吃饭这一日常行为。比如说,饭前喝洋酒、饭后吃甜点;那么我们再用描述解放前人们生活水平的那个java类就不合适了,这时候我们就需要再定义一个类来描述改革开放后人们生活水平了。就是说,同样是吃饭这一行为,但是后来人们吃饭这一行为方式多样化了,那么新定义的类在描述改革开放后的人的时候,就要把这种多样化体现出来。在java中,这种思想就是装饰设计,就是说提供更多更强的功能。

那么就具体说说在java中的体现吧;

装饰类通常会通过构造方法接收被装饰的对象;并基于被装饰类的功能,提供更强的功能;

装饰模式比继承要灵活,避免了继承体系臃肿;而且降低了类与类之间的关系;

装饰类因为增强已有对象,具有的功能和已有的功能是相同的,只不过提供了更强的功能;所以装饰类和被装饰类通常都属于一个体系中;


最后我总结就是:其实装饰设计就是通过总结继承和多态的优点来体现的。在定义后来的装饰类时,那种方式还是利用了继承的思想,就是用装饰类继承原有的被装饰的类;在装饰设计的过程中会去实现一些具体功能,这个时候可能会发生多继承的现象,程序就会显得臃肿。为了避免发生这种情况,就利用了多态的特性;把具体子类抽取出来共性的内容,在定义装饰类的时候可以把共性内容定义在里面,共性内容可以接收后来出现的新子类对象;而不必每实现单个子类功能就继承被装饰的类;而多态的存在不但提高了扩展性,也很大程度上优化了代码。

有些是个人观点,可能不够准确,希望各位老师同学不吝指正!





评分

参与人数 1技术分 +1 收起 理由
枫儿 + 1 赞一个!

查看全部评分

1 个回复

正序浏览
谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马