1.定义
代理模式为某个对象提供一个代理,以控制对这个对象的访问。代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。
2.举例说明
现实生活中有许多与Java静态代理模式相仿的例子
先从名称看来,代理,就比如生活中的各种中介,房地产中介,婚庆公司,留学机构等等。当我们有买房需求,结婚需求,留学需求等等,就去找中介来帮助我们,此时我们就是顾客。然而在买房,结婚,留学的过程中,有许多事情不是我们自己所必须要做的,比如找婚庆司仪,递交留学申请材料等等,这些小的事情可以交给中介公司帮我们解决,而我们只需要关注我们需要做的。中介公司的存在从某些意义上来说,可以使我们更好的、更加专注的完成我们的工作。
3.代码组成部分
(1)接口:主题
(2)代理类
(3)被代理类
实现方式:代理类和被代理类要实现同一个主题接口,而且代理类中要有一个被代理类的属性,这样才能把核心业务逻辑交还给被代理类完成;而一些与核心业务逻辑无关的逻辑,并且需求是多变的,那么这些逻辑就可以交给代理类来完成
4.以申请学校为例具体讲解
假如我们需要申请国外大学,每个大学不同专业有不同的申请要求,我们在申请学校时一般会寻求中介的帮助,我们自己需要做的是努力提高平均成绩,努力提高雅思成绩,写好Personal Statement等,以满足我们所申请大学的入学要求。而中介所需要做的是帮助我们申请,比如中介可以帮我们打印雅思成绩单,翻译PS,打印高中成绩单等等
接口:ApplyUniversity
package com.proxy;
public interface ApplyUniversity
{
public void iELTS();
public void personalStatement();
public void grade();
}
代理类:Agent
代理类中覆写了接口中的方法,也有自己的方法copyIELTS(),translatePS() ,copyGrade()。然而这三个方法,是Student不关心的,但是这三个方法又是帮助Student完成核心任务(申请学校)的方法。在Agent类中定义了接口类型的属性apu与构造方法,方便接收后期传入的实际参数。
package com.proxy;
public class Agent implements ApplyUniversity
{
private ApplyUniversity apu;
public Agent( ApplyUniversity apu) { //apu作为一个形参传入构造器中
this.apu=apu; //相当于ApplyUniversity apu =new UniversityOfBirmingham();
}
@Override
public void iELTS()
{
apu.iELTS();
copyIELTS();
}
@Override
public void personalStatement()
{
apu.personalStatement();
translatePS();
}
@Override
public void grade()
{
apu.grade();
copyGrade();
}
public void copyIELTS() {
System.out.println("打印IELTS成绩单");
}
public void translatePS() {
System.out.println("翻译Personal Statement");
}
public void copyGrade() {
System.out.println("打印高中成绩单");
}
}
被代理类:UniversityOfBirmingham
实现了ApplyUniversity接口,iELTS(),personalStatement(),grade()这三个方法是申请学校必须需要的。但是代理类中的,copyIELTS(),translatePS(),copyGrade()是学生没必要做的,由代理类来完成。
package com.proxy;
public class UniversityOfBirmingham implements ApplyUniversity
{
@Override
public void iELTS()
{
System.out.println("IELTS: Total>=7");
}
@Override
public void personalStatement()
{
System.out.println("PS:A+");
}
@Override
public void grade()
{
System.out.println("Average Grade: A");
}
}
测试类:
package com.proxy;
public class Student
{
public static void main(String args[]) {
//被代理者对象
UniversityOfBirmingham uob = new UniversityOfBirmingham();
//代理者对象
Agent a =new Agent(uob); //传入被代理者对象
a.iELTS();
a.personalStatement();
a.grade();
}
}
Output:
IELTS: Total>=7
打印IELTS成绩单
PS:A+
翻译Personal Statement
Average Grade: A
打印高中成绩单
总结一下:
如果我们自己来申请学校的话,需要做到IELTS: Total>=7,打印IELTS成绩单,PS:A+,翻译Personal Statement,Average Grade: A,打印高中成绩单。但是有了代理类,代理类帮我们完成打印IELTS成绩单,翻译Personal Statement,打印高中成绩单,我们只需要做到IELTS: Total>=7,PS:A+,Average Grade: A即可。我们的核心任务是申请学校,代理类帮我们简化了申请过程,减少麻烦。