代理模式
代理模式是设计模式的一种,也非常常出现在我们的生活中,大家都经历过校园生活,所以我打算拿代课老师与老师的例子去做说明已帮助同学们理解。
情景:年段长要安排授课计划给学生,找了老师,但是老师说我今天有事上不了课,年段长很是无奈就想了个办法,找一个代课老师让他代替今天老师去跟学生讲他今天要讲给学生的内容。UML 类图如下:
- 解释说明: 有一个 ITeacher 的接口,该接口有一个 teaching()的方法。代课老师和老师都实现了该方法,就表示了代课老师和老师都有上这节课的能力。但是代课老师不知道老师这节课要讲啥内容,所以需要聚合于老师,然后在 teaching()方法里调用老师的teaching()方法,以确保上课内容就是老师要讲的内容。这些关系建立起来后,年段长就可以安排代课老师进行授课计划啦。
package com.example.designpattern.proxy;
/**
* @Description: 可以授课的接口
*/
public interface ITeacher {
void teaching();
}
package com.example.designpattern.proxy;
/**
* @Description: 老师类
*/
public class Teacher implements ITeacher{
@Override
public void teaching() {
System.out.println("讲知识....");
}
}
package com.example.designpattern.proxy;
/**
* @Description: 代理老师类
*/
public class TeacherProxy implements ITeacher{
private Teacher teacher;
public TeacherProxy(Teacher teacher) {
this.teacher = teacher;
}
@Override
public void teaching() {
System.out.println("我是代课老师开始讲这节课知识");
// 这里的知识点是从编内老师那边学到的
teacher.teaching();
System.out.println("我是代课老师讲完这节课知识");
}
}
package com.example.designpattern.proxy;
import org.junit.jupiter.api.Test;
/**
* @PackageName: com.example.designpattern.proxy
* @ClassName: TeacherLeader
* @Description: 管理老师的类,类似于年段长
*/
public class TeacherLeader {
/**
* @Description: 安排一下咯
*/
@Test
public void arrange(){
Teacher teacher = new Teacher();
TeacherProxy teacherProxy = new TeacherProxy(teacher);
teacherProxy.teaching();
}
}
- 输出
Connected to the target VM, address: 'javadebug', transport: 'shared memory'
我是代课老师开始讲这节课知识
讲知识....
我是代课老师讲完这节课知识
Disconnected from the target VM, address: 'javadebug', transport: 'shared memory'
Process finished with exit code 0