代理模式是Java中常用的设计模式。
其特征是代理类和委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把信息转发给委托类,以及事后处理消息等。
代理类与委托类之间通常会存在关联关系,一个代理类对象与一个委托类对象关联,代理类对象本身并不真正实现服务,而是通过委托类对象的相关方法来提供特定服务。

需要代理对象和目标对象实现同样的接口。
缺点:但当需要的代理的对象过多就需要实现大量的代理类,并且当接口增加方法,目标对象与代理对象都要进行修改
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();
}
}
与静态代理相同,需要公共接口,委托类,代理类。区别就是动态代理是利用反射机制在运行是创建代理类