欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

代理proxy

程序员文章站 2022-03-27 07:56:11
代理模式是给某一个对象提供代理对象,并有代理对象控制对原对象的引用。目的:1)通过引入代理对象的方式,来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;2)通过代理对象对访问进行控制代理模式一般有三个角色:抽象角色: 指代理角色和真实角色对外提供的公共方法,一般为一个接口真实角色: 需要实现...

代理模式是给某一个对象提供代理对象,并有代理对象控制对原对象的引用。
目的:
    1)通过引入代理对象的方式,来间接访问目标对象,防止直接访问目标对象给系统带来的不必要复杂性;
    2)通过代理对象对访问进行控制

代理模式一般有三个角色:
    抽象角色: 指代理角色和真实角色对外提供的公共方法,一般为一个接口
    真实角色: 需要实现抽象角色接口,定义了真实角色所要实现的业务逻辑,以便供代理角色使用。真正的业务逻辑。
    代理角色: 需要实现抽象角色接口,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作。将统一的流程控制都放到代理角色中处理。
代理proxy

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

相关标签: java