说明: B和C实现同一个接口A, C为被装饰类,B为装饰类(可使用C的原有功能,也能对C的某些功能进行升级)。
代码实现:
接口类:
package com.klose.装饰设计模式;
public interface Coder {
public void code();
public void study();
}
被装饰类:
package com.klose.装饰设计模式;
public class Student implements Coder {
@Override
public void code() {
System.out.println("java");
System.out.println("python");
System.out.println("node");
}
@Override
public void study() {
System.out.println("do something...");
}
}
装饰类:
package com.klose.装饰设计模式;
public class TopStudent implements Coder {
//获取被装饰类的引用
private Coder coder;
//在构造方法中传入被装饰类的对象
public TopStudent(Coder coder){
this.coder=coder;
}
//对原有功能进行升级
@Override
public void code() {
System.out.println("do something myself...");
coder.code();
}
//使用原有功能
@Override
public void study() {
coder.study();
}
}
测试效果:
public class Test {
public static void main(String[] args) {
Student student = new Student();
TopStudent topStudent = new TopStudent(student);
topStudent.code();
System.out.println();
topStudent.study();
}
}
好处:
被装饰类只要实现接口都能用装饰类进行包装,对方法的使用灵活;
相比继承而言,耦合性不强,被装饰的类的变化与装饰类的变化无关;
使用场景:创建自定义数据库连接池,改写自己写的connection类中的close方法,并不关闭而是把连接交还给连接池pool。