代理proxy
程序员文章站
2022-06-28 23:06:04
代理模式是给某一个对象提供代理对象,并有代理对象控制对原对象的引用。目的:1)通过引入代理对象的方式,来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;2)通过代理对象对访问进行控制代理模式一般有三个角色:抽象角色: 指代理角色和真实角色对外提供的公共方法,一般为一个接口真实角色: 需要实现...
代理模式是给某一个对象提供代理对象,并有代理对象控制对原对象的引用。
目的:
1)通过引入代理对象的方式,来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
2)通过代理对象对访问进行控制
代理模式一般有三个角色:
抽象角色: 指代理角色和真实角色对外提供的公共方法,一般为一个接口
真实角色: 需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色使用。真正的业务逻辑。
代理角色: 需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制都放到代理角色中处理。
1. 静态代理
静态代理在使用时,需要定义接口或者父类,被代理对象与代理对象一起实现共同的接口或者继承相同父类。一般来说,被代理对象和代理对象是一对一的关系,当然一个代理对象对应多个被代理对象也是可以的。
一对一则会出现时静态代理对象多、代码量大,从而导致代码复杂,可维护性差的问题,一对多则代理会出现扩展能力查的问题。
抽象接口:
public interface Person {
void speak();
}
真实对象:
public class Student implements Person {
@Override
public void speak() {
Log.d("AAAAA", "student speak");
}
}
代理对象:
public class StudentProxy implements Person {
Student student;
public StudentProxy(Person student){
if (student.getClass() == Student.class){
this.student = (Student) student;
}
}
public void speak() {
student.speak();
}
}
测试,使用代理:
public class StaticProxyTest {
public static void main(String[] args) {
Person zs = new Student();
Person monitor = new StudentProxy(zs);
monitor.speak();
}
}
2. 动态代理
在运行时再创建代理类和实例,因此显然效率更低。要完成这个场景,需要在运行期创建一个class。jdk提供了Proxy来完成这件事。
抽象接口:
public interface Person {
void speak();
}
public interface Apple {
void a();
}
真实对象:
public class Student implements Person, Apple {
@Override
public void speak() {
Log.d("AAAAA", "student speak");
}
@Override
public void a() {
Log.d("AAAAA", "student aaaaaaa");
}
}
测试,使用代理:
public class ProxyTest {
public static void main(String[] args) {
final Student student = new Student();
Object o = Proxy.newProxyInstance(Person.class.getClassLoader(), new Class[]{Person.class, Apple.class}, new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] objects) throws Throwable {
return method.invoke(student, objects);
}
});
Person person = (Person) o;
person.speak();
Apple apple = (Apple) o;
apple.a();
}
}
InvocationHandler中的invoke方法,所有执行代理对象的方法都会被替换成执行invoke方法。
本文地址:https://blog.csdn.net/yan13507001470/article/details/111999887
上一篇: 从业4年 我整理了这几种实用网站推广方式