0x01 前言

静态代理只是一种设计模式,因此不需要任何的包,实现思路即可

注意点一:
静态代理在使用时,需要定义接口或者父类
代理对象与目标对象需要一起实现相同的接口或者是继承相同父类

注意点二:
代理对象与目标对象要实现相同的接口,然后代理对象通过调用相同的方法来调用目标对象的方法

0x02 环境

  1. 编辑器为: IntelliJ IDEA
  2. java版本:
  3. java version "1.8.0_271"
  4. Java(TM) SE Runtime Environment (build 1.8.0_271-b09)
  5. Java HotSpot(TM) 64-Bit Server VM (build 25.271-b09, mixed mode)
  6. 代码仓库: https://github.com/pmiaowu/JavaProxyTest

0x03 例子

例如我们去影院看电影:
我们平常去电影院看电影时,在电影开始与结束阶段是不是都会放广告呢?
电影是电影公司授权给影院进行播放与售卖的
那么电影公司就是目标对象,他只管和影院根据票房分钱,剩下的事情就不关它事了
而影院就是代理对象,负责其他的事情
在例如影院可以在播放电影的前后,产生一些除了电影票之外的额外收益
比如在影片开始与结束时播发一些广告

现在我们使用代码来进行模拟
首先创建个接口,通用的接口是代理模式实现的基础
这个接口就命名为Movie,里面有个play方法,表示电影播放的能力

  1. package 静态代理;
  2. public interface Movie {
  3. void play();
  4. }

接着创建个实现这个Movie接口的类,这个类表示电影公司授权给影院的电影

  1. package 静态代理;
  2. public class RealMovie implements Movie {
  3. @Override
  4. public void play() {
  5. System.out.println("您正在观看电影《嗨客帝国》");
  6. }
  7. }

然后创建个Cinema类,这个类表示影院要播放的电影,还有一些额外的操作
这个Cinema类就是个代理对象了

  1. package 静态代理;
  2. public class Cinema implements Movie {
  3. RealMovie movie;
  4. public Cinema(RealMovie movie) {
  5. super();
  6. this.movie = movie;
  7. }
  8. @Override
  9. public void play() {
  10. this.advertising1();
  11. this.movie.play();
  12. this.advertising2();
  13. }
  14. public void advertising1() {
  15. System.out.println("开始广告: 电影准备开始了,肯德基十翅一桶,只需要39元,快来买啊!");
  16. }
  17. public void advertising2() {
  18. System.out.println("结束广告: 电影结束了,肯德基十翅一桶,只需要39元,快买回家吃吧!");
  19. }
  20. }

最后面运行看看结果

  1. package 静态代理;
  2. public class Test {
  3. public static void main(String[] args) {
  4. RealMovie realMovie = new RealMovie();
  5. Movie movie = new Cinema(realMovie);
  6. movie.play();
  7. }
  8. }
  9. // 执行结果
  10. 开始广告: 电影准备开始了,肯德基十翅一桶,只需要39元,快来买啊!
  11. 您正在观看电影《嗨客帝国》
  12. 结束广告: 电影结束了,肯德基十翅一桶,只需要39元,快买回家吃吧!

0x04 总结

好处:
静态代理模式,可以在不改变目标对象的前提下,实现对目标对象的功能扩展

不足:
静态代理模式,代理对象(Cinema)实现了目标对象(RealMovie)所有的方法,一旦目标接口(Movie)增加新方法,代理对象(Cinema)和目标对象(RealMovie)都要进行相应的修改
其次,代理对象(Cinema)里面的每一个类方法,对应一个目标对象(RealMovie),如果目标对象(RealMovie)非常多
则静态代理类就会变的非常臃肿,极大的增加维护成本

例如:现在有一百部影片(继承Movie并实现)出来,那么就要创建一百个影院(Cinema),代码复用率也不高