设计模式之——装饰者模式
前言
装饰者模式是一种巧妙的类设计结构,可以便捷的实现对指定类功能的加强,本文将对装饰者模式的应用场景和实现进行讲解,希望能够让对该模式不清楚的读者一些参考。
现在有接口和实现类如下:
// 接口Animal
public interface Animal {
void eat();
}
// 实现子类Dog
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("汪汪汪...");
}
}
我们现在想实现Dog
类在吃完东西前先做一下检查食物是否足够,吃完东西后输出已经吃完的反馈。这种需求可以怎么实现呢?
我们自然而然地会想到,这很简单,我们在实现类中补上对应的代码不就行了
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("检查食物是否满足...");
System.out.println("汪汪汪...");
System.out.println("已经吃完啦...");
}
}
这当然是一种较为简单直接的实现方式,但如果Dog
类是前人已经开发并封装好的class
类,我们无法直接获取源代码进行修改,这个时候我们可以怎么实现eat
方法的增强呢?
实现的方式有很多种,比如应用装饰者模式。装饰可以理解为对某个功能进行增强,让它实现原先没有的功能。这里的话,被装饰者(也就是要增强的对象)自然就是Dog
类,装饰者的代码如下:
public class DecorationDog implements Animal {
private Animal animal;
public DecorationDog(Animal animal){
this.animal=animal;
}
@Override
public void eat() {
System.out.println("检查食物是否满足...");
animal.eat();
System.out.println("已经吃完啦...");
}
}
可以看到,装饰者和被装饰对象实现了同一个接口,且内部定义了一个
Animal
属性的成员变量,对eat
方法的调用,本质上调用的还是传入对象的eat
方法。也就是说,我们把需要增强的类对象Dog
传入了装饰者对象中,保持原对象方法不变的前提下,让装饰者来实现需要增强的功能,从而得到了最终的增强对象。
小结:
装饰者模式存在着以下特点:
1、可以在不改变被增强类源码的前提下,实现源代码特定功能的增强,增强的功能代码由装饰者负责提供
2、装饰者对象使用的前提是被装饰对象(也就是案例中的Dog
类)存在接口
3、装饰者模式有一定的弊端,当实现的接口中有上百个的时候,哪怕我们只是需要增强其中的某个功能,我们也不得不空实现其中的方法。