一、装饰设计模式:
对一组对象的功能进行增强时,就可以使用该模式进问题的解决。
对事物的本质不发生改变,只对它进行增强。
例如:买房子,买了毛坯房,进行装修后,功能增加、家庭更美,但是它的本质还是房子。
二、演示:
1、以前人出去吃饭,就是单纯的吃个饭。
代码演示:
public class Person {
public void eat(){
System.out.println("吃饭......");
}
}
public class PersonDemo {
public static void main(String[] args){
Person p1 =new Person();
p1.eat();
}
}
2、但是随着社会的进步,社会矛盾的变化。由人民对美好生活的需求转变为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。
随着人均可支配收入的增加,增生了一系列的饭后活动,比如唱KTV、洗脚等。
新时代的人民吃饭:
/**
* @author James
* @create 2020-01-02 22:46
* 新时代的人类吃饭
*
* 这个类的出现就是为了增强Person而出现的
*/
public class NewPerson {
private Person p;
NewPerson(Person p){
this.p=p;
}
public void eat(){
System.out.println("开胃饮料");
p.eat();
System.out.println("唱歌...");
}
}
public class PersonDemo {
public static void main(String[] args){
Person p1 =new Person();
NewPerson p2 = new NewPerson(p1);
p2.eat();
}
}
三、如果仅仅是为了实现以上的效果,那么通过继承就可以完成。
public class NewPerson2 extends Person {
@Override
public void eat(){
System.out.println("开胃饮料....");
super.eat();
System.out.println("唱歌.....");
}
}
public class PersonDemo {
public static void main(String[] args){
NewPerson2 p3=new NewPerson2();
p3.eat();
}
}
装饰者和继承都能实现一样的特点:进行功能的增强。
那么究竟是继承好?还是装饰者模式好?有什么区别呢?
首先有个继承体系:
TextWriter:用于操作文本。
MediaWriter:用于操作媒体。
想要对操作的动作进行效率的提高。按照面向对象的思想,可以通过继承对具体的功能进行扩展,效率的提高需要加入缓冲技术。
BufferedTextWriter:加入了缓冲技术的操作文本对象。
BufferedMediaWriter:加入了缓冲技术的操作媒体对象。
到这一步其实功能就完成了。但是这样并不是很理想。
如果这个体系进行功能的扩展,假如多一个流对象,那么这个流要提高效率,是不是也要产生子类呢?
答案 是的。一味地为了只提高功能,进行继承,越到后面,就会发现,这个继承体系就会变得越来越臃肿。
重新思考这个问题,既然加入的都是 同一种技术(缓冲),前一种(继承)是让缓冲和具体的技术想结合。
那么可以不可以将缓冲进行单独的封装,哪个对象需要缓冲,就将哪个对象和缓冲关联。
如下代码:
谁需要缓冲技术就将谁传入缓冲区。
public class Buffered {
Buffered(TextWriter tw){
.....
}
Buffered(MediaWriter mw ){
.....
}
}
但是通过分析发现,传入的对象都是Writer的子类,如果我一百个Writer的子类需要添加缓冲技术,难道我就得传入一百个对象吗?
利用多态的知识,操作父类,下面的子类就能都能拥有子类的功能。
/**
* @author James
* @create 2020-01-03 11:39
*/
public class BufferedWriter extends Writer {
BufferedWriter(Writer r)
{
......
}
}
再看继承体系:
就显得简洁、明了。
装饰比继承灵活。
特点:装饰类和被装饰类都必须同属于一个接口或者父类。