概念

代理模式是Java中常用的设计模式。

其特征是代理类和委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把信息转发给委托类,以及事后处理消息等。

代理类与委托类之间通常会存在关联关系,一个代理类对象与一个委托类对象关联,代理类对象本身并不真正实现服务,而是通过委托类对象的相关方法来提供特定服务。

Untitled

静态代理

需要代理对象和目标对象实现同样的接口。

缺点:但当需要的代理的对象过多就需要实现大量的代理类,并且当接口增加方法,目标对象与代理对象都要进行修改

Demo

学生交作业,一般都是学生先交给课代表,课代表交给老师这种模式。课代表在这里相当于说一个学生代理类。

需要一个公共代理接口,这个接口是学生(委托类),和课代表(代理类)的公共接口

public interface Event {
    void SubmitWork();
}

需要编写一个学生类(委托类),需要实现公共代理接口和重写接口中的方法

public class Student implements Event{
    String name;

    public Student(String n) {
        this.name = n;
    }

    @Override
    public void SubmitWork() {
        System.out.println(this.name + "提交作业");
    }

}

还需要一个代理类,同样需要实现公共代理接口和重写接口中的方法

public class StudentInnovation implements Event{
    Student student;
    int count = 0; //收到的作业数量

    public StudentInnovation(Student stu){
        // 只代理学生对象
        if(stu.getClass() == Student.class) {
            this.student = (Student)stu;
        }
    }

    public void setStudent(Student student) {
        this.student = student;
    }

    @Override
    public void SubmitWork() {
        this.student.SubmitWork();
        this.count += 1;
        System.out.println("已收作业数量为" + this.count);
    }
}

一个简单代理

public class main {
    public static void main(String[] args) {
        //被代理的学生张三,他的作业提交由代理对象monitor(课代表)完成
        Student s1 = new Student("张三");
        Student s2 = new Student("李四");
        Student s3 = new Student("王五");
        //生成代理对象,并将张三传给代理对象
        StudentInnovation monitor = new StudentInnovation(s1);
        //向课代表提交作业
        monitor.SubmitWork();
        monitor.setStudent(s2);
        monitor.SubmitWork();
        monitor.setStudent(s3);
        monitor.SubmitWork();
    }
}

动态代理

与静态代理相同,需要公共接口,委托类,代理类。区别就是动态代理是利用反射机制在运行是创建代理类