装饰模式是一种结构型模式,这种模式创建了一个装饰类,用来包装原有的类,在原有类的方法签名不变的情况下,增加额外的功能。
举个例子,
BufferedReader br=new BufferedReader(new InputStreamReader(new FileinputStream(file)));
InputStreamReader本身有read()方法可以读取单个字符,这样在有的场景下不是很方便,比如我就是想每次读取一行怎么办。
这个时候就出现了一个增强版的BufferedReader,将InputStreamReader这个转换流作为参数传进来,就可以使用readLine()方法了,同时,new InputStreamReader这个对象的功能没有任何影响。注意:BufferedReader和InputStreamReader同时实现了java.io.Reader接口
继承不是也能够实现这个功能吗,为什么不用继承?
继承的缺点
1)单继承
2)对于已经存在的父类对象,无法使之调用子类方法
3)对于子类对象而言,无法调用父类对象
利用一个统一的父类或者接口,将一个子类对象作为参数来构造另一个子类对象,对其中的方法做改变或者增强—装饰模式
如何实现呢,其实在第一个例子中就可以看出来了,写一个增强类,和原类同时继承一个接口,然后将接口作为增强类的参数传入。
定义一个员工接口,定义一个小组长类和经理类,将搬砖小组长包装成经理,经理构造方法添加接口作为参数:
public class DecorateDemo2 {
public static void main(String[] args) {
TeamLeader t1=new TeamLeader();
t1.work();
Manager m=new Manager(t1);
m.work();
}
}
interface Staff{
void eat();
void work();
}
class Manager implements Staff{
public Manager(Staff f){
}
@Override
public void eat() {
System.out.println("在天上人间吃饭");
}
@Override
public void work() {
System.out.println("经理在处理文件");
}
}
class TeamLeader implements Staff{
@Override
public void eat() {
System.out.println("在公司食堂吃饭");
}
@Override
public void work() {
System.out.println("小组长在搬砖");
}
}