一.装饰者模式的实现方式
1.写一个接口
2.写一个类实现该接口,并重写接口里的方法,这个类就是装饰类
3.再写一个类实现该接口,并创建装饰类的引用,写一个构造方法,将装饰类作为参数传入,并在实现接口的方法里通过装饰类调用装饰类方法,同时可以在该方法里写些其他操作,也就是对装饰类方法进行增强,该类由于调用了装饰类,被称为被装饰类。
interface Studyer{
//一个学习功能public void study();
}
class Person implements Studyer{
//被装饰类 其实装饰类和被装饰类就是父类和子类的关系 只不过用装饰者模式可以降低子类与父类之间的一个耦合度 子类不会受到父类变化的影响//而装饰着可以选择多个不同被装饰类作为参数进行加强功能//被装饰类@Override
public void study() {
System.out.println("需要学会基础的学习能力");
}
}
class Student implements Studyer{
private Person person;
public Student(Person person) {
this.person = person;
}
@Override
public void study() {
person.study();
System.out.println("需要学习能力强");
System.out.println("需要遵守纪律");
}
}
二.为什么要使用装饰者模式
同一个接口,一个类在另外一个类基础上实现增强方法,以前是采用继承,为什么要采用装饰者模式
类继承一旦父类改变,那么子类也得相应进行改变,也就是说它们之间的耦合性太高,不利于代码的维护和管理,使用装饰者模式可以将装饰类和被装饰类彼此独立起来,只需要实现共同的接口,一旦需要改代码升级时,只需要更改相应的类就可以了,不需要都改变。
三.哪里有使用装饰者模式
按照常规继承的话,实现FileWriter,MediaWriter,DataWriter并且让其实现缓冲写出功能得这么做,但是导致了继承体系的臃肿,而且子类功能的重复,关联性也大,不利于维护。
Writer
|--FileWriter
|--BufferedFileWriter
|--MediaWriter
|--BufferedMediaWriter
|--DataWriter
|--BufferedDataWriter
很显然jdk没有这么处理,而是采用了装饰者模式,实现共同接口Writer,将BufferWriter作为一个共同的被装饰类,创建一个父类对象Writer,通过构造方法
可以传入FileWriter ,MediaWriter,DataWriter,作为父类Wirter引用指向它们三个中任意一个子类对象。
Writer
|--FileWriter
|--MediaWriter
|--DataWriter
|--BufferedWriter
从而实现了装饰者模式,其实传入实例之后就相当于以下情况了
BufferedWriter(FileWriter w){}
BufferedWriter(MediaWriter w){}
BufferedWriter(DataWriter w){}