0%

代理模式之静态代理

代理模式我们可以从字面上去理解它的涵义,代理就是代替某个事物去处理事情,代理在代替处理事情的时候可能还会添加一些它的补充行为。以生活中申请留学的代理机构为例,代理机构代替你去申请国外高校,除了“申请高校”这件事外,它还在申请之前帮你“查询高校信息”,并在申请成功之后向你“要代理费”。接下来我就以申请留学为例简单实现一个静态代理的例子。

三个角色

  • 要代理的事情(一般是一个接口):申请留学这件事(StudyAbroad)

  • 委托人:学生(Student)

  • 代理人:留学申请机构(StudyAbroadAgent)

他们的关系:留学申请机构代理学生去申请留学

实现

StudyAbroad.java

要代理的事:申请留学,就是一个接口

1
2
3
4
5
6
/**
* 要代理的事情:申请留学这件事
*/
public interface StudyAbroad {
void applyForStudyAbroad();
}

Student.java

学生要出国留学,也是真正要做代理的事的对象,他实现申请留学这件事的接口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/**
* 学生
*/
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

代理机构同样也实现申请留学这件事的接口,但他在实现时调用了委托人的申请留学方法,也就是委托人申请留学。并且在代理申请留学之前还帮助学生查询了高校信息,替学生省事了,但是代理完后要交钱😂

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 代理人:留学申请机构
*/
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)申请留学。

1
2
3
4
5
6
7
public class Main {
public static void main(String[] args) {
Student student = new Student("MakerHu");
StudyAbroadAgent studyAbroadAgent = new StudyAbroadAgent(student);
studyAbroadAgent.applyForStudyAbroad();
}
}

运行结果

1
2
3
查询国外高校信息。
MakerHu申请留学成功!
收取代理费。

静态代理模式有啥用呢?

在java的多线程中就用到了静态代理模式。

我们在实现多线程时,首先写一个自己的类MyRunnabale实现Runnable,接着通过new Thread(new MyRunnable).start();开启线程。

在Java中Thread实现了Runnable接口,因此在代理模式中,他们的扮演的身份分别是:

  • 要代理的事情:Runnable中的run()方法
  • 委托类:你实现的类MyRunnable
  • 代理类:Thread

继续学习:代理模式之动态代理 | MakerHu的博客