代理模式

静态代理

public interface ISinger {
 2     void sing();
 3 }
 4 
 5 /**
 6  *  目标对象实现了某一接口
 7  */
 8 public class Singer implements ISinger{
 9     public void sing(){
10         System.out.println("唱一首歌");
11     }  
12 }
13 
14 /**
15  *  代理对象和目标对象实现相同的接口
16  */
17 public class SingerProxy implements ISinger{
18     // 接收目标对象,以便调用sing方法
19     private ISinger target;
20     public UserDaoProxy(ISinger target){
21         this.target=target;
22     }
23     // 对目标对象的sing方法进行功能扩展
24     public void sing() {
25         System.out.println("向观众问好");
26         target.sing();
27         System.out.println("谢谢大家");
28     }
29 }

/**
 2  * 测试类
 3  */
 4 public class Test {
 5     public static void main(String[] args) {
 6         //目标对象
 7         ISinger target = new Singer();
 8         //代理对象
 9         ISinger proxy = new SingerProxy(target);
10         //执行的是代理的方法
11         proxy.sing();
12     }
13 }

动态代理

public interface ISinger {
 2     void sing();
 3 }
 4 
 5 /**
 6  *  目标对象实现了某一接口
 7  */
 8 public class Singer implements ISinger{
 9     public void sing(){
10         System.out.println("唱一首歌");
11     }  
12 }

这回直接上测试,由于java底层封装了实现细节(之后会详细讲),所以代码非常简单,格式也基本上固定。

调用Proxy类的静态方法newProxyInstance即可,该方法会返回代理类对象

static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces,InvocationHandler h )
接收的三个参数依次为:

ClassLoader loader:指定当前目标对象使用类加载器,写法固定
Class<?>[] interfaces:目标对象实现的接口的类型,写法固定
InvocationHandler h:事件处理接口,需传入一个实现类,一般直接使用匿名内部类

public class Test{
 2     public static void main(String[] args) {
 3   Singer target = new Singer();
 4         ISinger proxy  = (ISinger) Proxy.newProxyInstance(
 5                 target.getClass().getClassLoader(),
 6                 target.getClass().getInterfaces(),
 7                 new InvocationHandler() {
 8                     @Override
 9                     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
10                         System.out.println("向观众问好");
11                         //执行目标对象方法
12                         Object returnValue = method.invoke(target, args);
13                         System.out.println("谢谢大家");
14                         return returnValue;
15                     }
16                 });
17         proxy.sing();
18     }
19 }
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题记:一个偶然的原因看了木心的一些文章和诗句,觉得特别棒,摘抄几句品味一下,亦是有趣的紧。标题是打错了,本来想叫名...
    勇哥在进化阅读 575评论 2 0
  • 自己对悲观的理解: 只是习惯于用最保守的态度去看待问题,尽量把风险控制在可承受范围内…… 悲观与内心态度无关,与毅...
    痴遇阅读 183评论 0 2
  • 正值怀孕初期,看了董卿主持的《朗读者》,由名模张梓琳朗读的作家刘瑜写给女儿的那篇《愿你慢慢长大》深深打动了我。 文...
    悦己_蕾蕾阅读 339评论 0 3
  • 纳兰玲珑/文 梨花盛开时 我路过 石库门的楼下 一道道 拱形门 从一楼排到了 顶楼 波浪起伏 尖尖的屋顶 犹如教堂...
    纳兰玲珑阅读 397评论 9 14