静态代理
- 静态代理很好理解,实现了相同接口,对原实现类包装。
- 通过操作传入的原实现类对象来打到增强效果。
- 代理类包含了原实现类的操作,所以调用代理对象即可。
通俗的讲:静态代理就是写出一个被代理类的双胞胎类,有共同的接口父亲,只是代理类拿着兄弟的对象在自己内部操作兄弟的行为,同时做些自己的事。
案例:结婚 婚庆公司
静态代理:
- 和被代理目标类实现相同接口(获取相同接口方法)
- 代理类是对目标类的增强辅助
- 代理类需要传入被操作的目标类对象
- 代理类实现相同接口方法的时候需要在其中加入目标类的方法调用
- 调用代理类的接口方法即可实现增强
// 静态代理模式演示
public class staticProxy {
public static void main(String[] args) {
// 开始代理 代理对象获取代理目标
WeddingCompany weddingCompany = new WeddingCompany(new YouAction());
weddingCompany.HappuMarry();
}
}
结婚接口:
// 定义结婚接口动作
public interface Marry {
void HappuMarry();
}
定义结婚人动作:
// 真实结婚角色
public class YouAction implements Marry{
@Override
public void HappuMarry() {
// 定义你的结婚动作
System.out.println("你在结婚,开心");
}
}
定义代理公司动作:
// 婚庆代理公司
public class WeddingCompany implements Marry {
// 定义被代理目标
private Marry target;
public WeddingCompany(Marry target) {
this.target = target;
}
// 代理公司行为
@Override
public void HappuMarry() {
before();
this.target.HappuMarry();
after();
}
// 定义代理公司增强部分
public void before(){
System.out.println("代理公司,收定金。");
System.out.println("代理公司,布置现场。");
System.out.println("代理公司,主持。");
}
public void after(){
System.out.println("代理公司,完成任务");
System.out.println("代理公司,收尾款");
}
}
代理公司,收定金。
代理公司,布置现场。
代理公司,主持。
你在结婚,开心
代理公司,完成任务
代理公司,收尾款
简短版本静态代理案例:
// 静态代理测试
public class StaticProxy {
public static void main(String[] args) {
HelloProxy helloProxy = new HelloProxy();
helloProxy.sayHello();
}
}
// 代理
class HelloProxy implements HelloInterface{
// 被代理对象 接口获取 一般是一对一的,直接固定创建即可
private HelloInterface helloInterface = new Hello();
@Override
public void sayHello() {
System.out.println("静态代理输出--1");
System.out.println("静态代理输出--2");
helloInterface.sayHello();
System.out.println("静态代理输出--3");
System.out.println("静态代理输出--4");
}
}
// 被代理
class Hello implements HelloInterface{
@Override
public void sayHello() {
System.out.println("被代理类输出--hello");
}
}
// 共同接口
interface HelloInterface{
void sayHello();
}