接上文:4.Java设计模式-----代理模式(Proxy Pattern)
应用场景:
因为房租合同到期,小明现在急需要重新寻找房源,但是苦于学业的原因,而没时间来解决找房这件事情,所以它只能将这事情交给中介公司来帮自己解决这件事情。
静态代理的实现比较简单,代理类通过实现与目标对象相同的接口,并在类中维护一个代理对象。通过构造器塞入目标对象,赋值给代理对象,进而执行代理对象实现的接口方法,并实现前拦截,后拦截等所需的业务功能。
①首先定义一个接口
/**
* 首先定义一个Person接口,然后声明一个findHouse方法
*/
public interface Person{
//找房子
public void findHouse();
}
②获取被代理用户(学生)的需求
/**
* 学生租房的一些个人需求
*/
public class Student implements Person{
@Override
public void findHouse(){
System.out.println("被代理人需求:我是学生A,我现在想找一个10平米的小房间,用来学习");
}
}
③接下来,就是代理对象(租房中介)的创建
/**
* 代理人的创建(中介)
*/
public class Proxy implements Person{
//1.真正需要代理的类(学生)
Student student;
//2.生成一个有参构造方法,方便中介来获取用户的需求
public Proxy(Student student){
this.student = student;
}
@Override
public void findHouse(){
System.out.println("(此处为前置增强)--我是中介,如下是用户的一些需求");
System.out.println("**************************************************");
//4.在代理类中,间接的访问被代理用户的方法
student.findHouse();
System.out.println("**************************************************");
System.out.println("(此处为后置增强)--我是中介,如上就是我代理用户的需求");
}
}
④代理类将帮助被代理人发布信息,帮其找房子(即:开始测试)
public class test{
public static void main(String[] args){
//1.创建一个被代理用户
Student student = new Student();
//2.创建一个代理用户,将用户通过构造方法传递给被代理类
Proxy proxy = new Proxy(student);
//3.代理用户开始帮助用户找房子
proxy.findHouse();
}
}
代码运行结果:
(此处为前置增强)--我是中介,如下是用户的一些需求
**************************************************
被代理人需求:我是学生A,我现在想找一个10平米的小房间,用来学习
**************************************************
(此处为后置增强)--我是中介,如上就是我代理用户的需求
静态代理实现原理:在main方法中,通过调用代理类对象的findHouse()方法,在该方法中,间接来调用被代理对象findHouse()方法,从而实现静态代理机制
静态代理的优点和缺点
优点:可以做到不对目标对象进行修改的前提下,对目标对象进行功能的扩展和拦截,这其实是代理机制的共同优点
缺点:①代理类,必须实现与目标对象一样的接口,会导致代理类数量太多,不易维护
②如果父类接口增加方法,则目标对象和代理类都需要重新维护
附链接:4. Java设计模式-----代理模式(Proxy Pattern)
4.2 Java设计模式-----JDK动态代理(Dynamic Proxy)
4.3 Java设计模式-----Cglib动态代理(Cglib Proxy)