设计模式之——静态代理
前言
静态代理常和动态代理、装饰者模式一起提起,原因是静态代理和其余二者总有着较大的相似和关联,本篇文章将对静态代理的使用与特点进行讲解,希望能够为不清楚该设计模式的读者一个参考。
我们这里举一个和装饰者一样的案例,存在如下的接口和实现:
// 接口Animal
public interface Animal {
void eat();
}
// 实现子类Dog
public class Dog implements Animal {
@Override
public void eat() {
System.out.println("汪汪汪...");
}
}
现在我们要实现Dog类进食前后的食物校验和进食完毕的反馈功能,用静态代理的实现方式如下:
public class ProxyDog implements Animal {
private Animal animal;
public ProxyDog(){
this.animal = new Dog();
}
@Override
public void eat() {
System.out.println("检查食物是否满足...");
animal.eat();
System.out.println("已经吃完啦...");
}
}
我们可以发现,静态代理的实现方式和装饰者模式十分的类似,都是实现了被代理对象(被装饰者)的接口。区别之处在于,静态代理在构造函数的时候就定义好了被代理的对象,而装饰者模式要增强的对象只有在传入的时候才能够明确。对于静态代理而言,调用者并不关心被代理的对象是谁,只在于代理对象是否能够实现对应的功能。
装饰器模式关注于在一个对象上动态地添加方法,而代理模式关注于控制对对象的访问。换句话说,用代理模式,代理类可以对它的客户隐藏一个对象的具体信息。因此当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例;当使用装饰器模式的时候,我们通常的做法是将原始对象作为一个参数传给装饰器的构造器。
小结
静态代理存在着以下特点:
1、代理对象在创建的过程中即定义好了被代理对象,而装饰者模式被增强的对象只有在调用的时候才确定。
2、静态代理侧重于对强调对对象的访问控制,屏蔽调用者对被代理对象的直接使用;装饰者模式则更加侧重对某个功能的增强。
3、静态代理由于被代理对象时已经确定好的,当需要代理的对象很多时,我们就不得不重复地写代码结构相似的代理类。(这也引出了动态代理)