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