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