装饰设计模式—动态的为对象添加功能。(结构型设计模式)
这种设计模式要求被装饰者与装饰的组件都继承自同一个同一个类,都复写一个方法,被装饰的类作为组件的构造方法的参数传入组件,组件中定义一个被装饰的对象声明作为成员变量,当执行构造函数的时候给它初始化。组件的方法调用被装饰类的方法。我们需要什么组件的功能就用什么组件装饰被装饰类。
相当于每次我们吃兰州拉面的时候,先点一份面,就是一个叫“兰州拉面”的类,然后做好之后用“加蛋兰州拉面”这个类装饰它,使兰州拉面具有“吃蛋”的功能。
面接口:功能接口,被装饰的类与组件都要实现里面的方法
package 设计模式.装饰者设计模式;
public interface mian {
void noodles();
}
兰州拉面:需要被修饰的类
package 设计模式.装饰者设计模式;
public class Lzlm implements mian {
@Override
public void noodles() {
System.out.println("兰州拉面!!!!!");
}
}
加蛋兰州拉面:组件类,需要内部声明被修饰的类。
package 设计模式.装饰者设计模式;
public class Jdlzlm implements mian {
Lzlm lzlm;
public Jdlzlm(Lzlm m) {
this.lzlm =m;
}
@Override
public void noodles() {
lzlm.noodles();
System.out.println("加鸡蛋!!!!!");
}
}
Test类:测试类
package 设计模式.装饰者设计模式;
public class Test {
public static void main(String[] args) {
Jdlzlm jdlzlm = new Jdlzlm(new Lzlm());
jdlzlm.noodles();
}
}
结果:
实现了对兰州拉面装饰上蛋的功能。
几个JDK中装饰模式的应用(不全)
- java.io.BufferedInputStream(InputStream)
- java.io.BufferedOutputStream(OutputStream)
- Set—>SortedSet、 Map—>SortedMap
- java.util.Collections很多