代理模式:利用一个代理对象将具体需要代理的对象包装起来,然后利用代理对象来取代具体对象,当需要操作具体对象时,都是通过代理对象来完成对具体对象的操作;
静态代理的核心:
1、代理类与具体类实现同一个接口,以便具有相同的行为;
2、代理类要持有具体类的引用,以便控制具体类进行操作;
以下是代码演示:
1、总接口:Person 定义其子类具有的相同的行为;
public interface Person {
void setAge(int age);
int getAge();
}
2、具体类:Jack
public class Jack implements Person {
private int age;
public Jack(){
System.out.println("正在使用构造函数生成本人实例");
}
@Override
public void setAge(int age) {
System.out.println("我是Jack,我将接收一个年龄age = "+age);
this.age = age;
}
@Override
public int getAge() {
System.out.println("我是Jack,我将返回我的年龄age :"+age);
return age;
}
}
3、代理类: Proxy
public class Proxy implements Person {
//拿到具体对象的引用
private Jack jack;
public Proxy(Jack jack){
this.jack = jack;
}
@Override
public void setAge(int age) {
System.out.println("我是代理类,我将先审核接收的年龄再决定是否给我的委托人jack"); //模仿代理类自己先要执行的逻辑
jack.setAge(age);//控制具体执行类执行其方法
System.out.println("我是代理类,我已经将接收到的年龄给我的代理人jack了");
}
@Override
public int getAge() {
System.out.println("我是代理类,我将要通知jack返回他的年龄");
return jack.getAge();
}
}
4、测试
public class StaticProxyTest {
public static void main(String[] args) {
//开始对jack进行代理
System.out.println("----------开始对jack进行代理--------------");
Person person = new Proxy(new Jack());
//设置一个年龄,完成代理
person.setAge(12);
//获取一个年龄
System.out.println("---------开始利用代理类获取年龄------------");
int age = person.getAge();
System.out.println("age = " + age);
}
}
结果:
5、总结:
1、代理类与具体类实现同一个接口,以便具有相同的行为;
2、代理类要持有具体类的引用,以便控制具体类进行操作;
3、代理类实例化具体类有很多种方式,究其重点就在于在合适的时候去实例化具体类,以便合理的控制具体类进行操作;
4、静态代理一个重大的缺点就是,好比一对一服务一样,每一个需要被代理的具体类,都需要一个新的代理类,会增加系统复杂性,资源消耗;