代理模式我们可以从字面上去理解它的涵义,代理就是代替某个事物去处理事情,代理在代替处理事情的时候可能还会添加一些它的补充行为。以生活中申请留学的代理机构为例,代理机构代替你去申请国外高校,除了“申请高校”这件事外,它还在申请之前帮你“查询高校信息”,并在申请成功之后想你“要代理费”。接下来我就以申请留学为例简单实现一个静态代理的例子。
三个对象
要代理的事情(一般是一个接口):申请留学这件事(StudyAbroad)
被代理的人:学生(Student)
代理人:留学申请机构(StudyAbroadAgent)
他们的关系:留学申请机构代理学生去申请留学
实现
StudyAbroad.java
要代理的事:申请留学,就是一个接口
/**
* 要代理的事情:申请留学这件事
*/
public interface StudyAbroad {
void applyForStudyAbroad();
}
Student.java
学生要出国留学,也是真正要做代理的事的对象,他实现申请留学这件事的接口
/**
* 学生
*/
public class Student implements StudyAbroad{
private String name;
public Student(String name){
this.name = name;
}
@Override
public void applyForStudyAbroad() {
System.out.println(this.name + "申请留学成功!");
}
}
StudyAbroadAgent.java
代理机构同样也实现申请留学这件事的接口,但他在实现时调用了被代理人的申请留学方法,也就是替被代理人申请留学。并且在代理申请留学之前还帮助学生查询了高校信息,替学生省事了,但是代理完后要交钱😂
/**
* 代理人:留学申请机构
*/
public class StudyAbroadAgent implements StudyAbroad{
// 被代理的人
private StudyAbroad studyAbroad;
public StudyAbroadAgent(StudyAbroad studyAbroad){
this.studyAbroad = studyAbroad;
}
@Override
public void applyForStudyAbroad() {
before();
studyAbroad.applyForStudyAbroad(); // 替被代理的人完成要代理的事
after();
}
// 申请之前帮你查询国外高校信息
public void before(){
System.out.println("查询国外高校信息。");
}
// 申请之后向你要代理费
public void after(){
System.out.println("收取代理费。");
}
}
Main.java
主函数,请代理机构帮某个学生(MakerHu)申请留学。
public class Main {
public static void main(String[] args) {
Student student = new Student("MakerHu");
StudyAbroadAgent studyAbroadAgent = new StudyAbroadAgent(student);
studyAbroadAgent.applyForStudyAbroad();
}
}
运行结果
查询国外高校信息。
MakerHu申请留学成功!
收取代理费。
静态代理模式有啥用呢?
在java的多线程中就用到了静态代理模式。
我们在实现多线程时,首先写一个自己的类MyRunnabale实现Runnable,接着通过new Thread(new MyRunnable).start();
开启线程。
在Java中Thread实现了Runnable接口,因此在代理模式中,他们的扮演的身份分别是:
要代理的事情:Runnable中的run()方法
被代理的类:你实现的类MyRunnable
代理类:Thread