代理模式的定义:由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接引用目标对象,代理对象作为访问对象和目标对象之间的中介。
和被代理对象实现相同的接口
在代理类中,需要对被代理对象初始化
需要实现和被dialing对象相同的方法,并且在这个方法中核心(原始)业务调用被代理对象的,增强的业务在这里进行增强就行了
public interface Person {
void eat();
}
public class Student implements Person{
@Override
public void eat() {
System.out.println("学生在买饭");
}
}
public class Teacher implements Person{
private Student s ;
public Teacher(){
this.s = new Student();
}
@Override
public void eat() {
s.eat();
}
}
public class Test {
public static void main(String[] args) {
Teacher t = new Teacher();
t.eat();
}
}

- 如果有很多个对象需要找代理,那么就需要实现很多个对象的代理类,这样的话代码臃肿,用户体验很一般;
- 如果被代理的方法过多,每个方法都需要增强,代码不整洁,大量搬用的工作 它有这两大缺陷就造成了写大型项目的时候,就不会用静态代理这个设计模式
在程序执行过程中,使用jadk的反射机制,创建代理类对象,并动态的指定要代理目标类。
动态代理是使用jd的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件。不用写java文件。
public interface Person {
void eat();
}
public class Student implements Person{
@Override
public void eat() {
System.out.println("学生去买饭");
}
}
public class Teacher implements InvocationHandler {
private Person person;
public Object prxy() {
return Proxy.newProxyInstance(person.getClass().getClassLoader(),
person.getClass().getInterfaces(),this);
}
public Teacher(Person person) {
this.person = person;
}
// 1.调用目标方法
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 2.增强功能
System.out.println("老师要吃饭");
System.out.println("小花给我买饭去");
method.invoke(person,args);
System.out.println("老师吃饭了");
return null;
}
}
public class Test {
public static void main(String[] args) {
Student student = new Student();
Teacher teacher = new Teacher(student);
Person ob = (Person)teacher.prxy();
ob.eat();
}
}