前提是先有一个类,这个类可能是以前别人定义的或者是自己定义的,过了一段时间之后发现它的功能不能满足当前的需求了。那么我们就需要对它的功能进行扩展或者说增强。当然我们不能改变源码;那么我们可以再定义一个类,并且将已有对象作为参数传入,基于已有的功能,并提供加强功能。
那么后来定义的增强功能的类就称为装饰类。这种设计思想就称为装饰设计模式。 下面举个例子来具体体现一下装饰设计模式,当然这是引用毕老师的经典案例!
- <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em">
- <BLOCKQUOTE>class Person{
- public void chifan(){
- System.out.println("吃饭");
- }
- }
- class SuperPerson{
- private Person p;
- SuperPerson(Person p){
- this.p = p;
- }
- public void superChifan(){
- System.out.println("开胃酒");
- p.chifan();
- System.out.println("甜点");
- System.out.println("抽烟");
- }
- }
- public class PersonDemo {
- <P></P>
- <P style="LINE-HEIGHT: 30px; TEXT-INDENT: 2em">public static void main(String[] args){
- Person p = new Person();
- SuperPerson sp = new SuperPerson(p);
- sp.superChifan();
- }
- }</P>
复制代码首先Person类就是原先定义的类,我们可以这样理解:作为人要是生活在解放前的话,我们只有吃饭这一行为,仅为了填报肚子。因为那时候穷嘛,没办法。不过到了改革开放后,人民生活水平提高了,人们开始享受吃饭这一日常行为。比如说,饭前喝洋酒、饭后吃甜点;那么我们再用描述解放前人们生活水平的那个java类就不合适了,这时候我们就需要再定义一个类来描述改革开放后人们生活水平了。就是说,同样是吃饭这一行为,但是后来人们吃饭这一行为方式多样化了,那么新定义的类在描述改革开放后的人的时候,就要把这种多样化体现出来。在java中,这种思想就是装饰设计,就是说提供更多更强的功能。 那么就具体说说在java中的体现吧; 装饰类通常会通过构造方法接收被装饰的对象;并基于被装饰类的功能,提供更强的功能; 装饰模式比继承要灵活,避免了继承体系臃肿;而且降低了类与类之间的关系; 装饰类因为增强已有对象,具有的功能和已有的功能是相同的,只不过提供了更强的功能;所以装饰类和被装饰类通常都属于一个体系中;
最后我总结就是:其实装饰设计就是通过总结继承和多态的优点来体现的。在定义后来的装饰类时,那种方式还是利用了继承的思想,就是用装饰类继承原有的被装饰的类;在装饰设计的过程中会去实现一些具体功能,这个时候可能会发生多继承的现象,程序就会显得臃肿。为了避免发生这种情况,就利用了多态的特性;把具体子类抽取出来共性的内容,在定义装饰类的时候可以把共性内容定义在里面,共性内容可以接收后来出现的新子类对象;而不必每实现单个子类功能就继承被装饰的类;而多态的存在不但提高了扩展性,也很大程度上优化了代码。 有些是个人观点,可能不够准确,希望各位老师同学不吝指正!
|