代理设计模式

概述

设计模式体现出的是一种编程思想,偶尔跟人交流(装逼)时,都喜欢把编程形容为一门艺术,而艺术往往包含了思想、灵魂甚至是哲学的元素在里面。所以很多人觉得程序员闷骚,怪异和宅等。其实细想一下,这也不就是艺术家的特性嘛。朴素的唯物主义认为世界是由金木水火土组成的,而对于程序员来说,世间皆由对象组成的,金木水火土间接或直接的构成对象,我是不是可以认为,程序员都属于唯物主义者的艺术家呢。哈哈哈哈哈哈哈哈…装逼到此。
今天讲的代理设计模式是程序中很常用且很重要的一种设计模式。我们常使用的框架如Retrofit、 Xutils等都使用了代理设计模式,定义:为其他对象提供一种代理,以控制对这个对象的访问。通过调用代理,来间接的调用实际的对象。它分为静态代理和动态代理。举个例子,假如我们要去银行办卡,但是我们自己能直接办卡吗,这肯定是不能的,卡是由银行的工作人员来帮我们办的。我们有办卡的需求,而工作人员就是代理对象,间接的帮我们完成需求。

具体实现

静态代理

1
2
3
4
5
6
/**
* description: 静态代理设计模式 - 目标接口
*/
public interface IHelper {
void help();
}
1
2
3
4
5
6
7
8
9
/**
*被代理对象,办卡的人
*/
public class Man implement IHelper{
@Override
public void help{
System.out.println("办卡");
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
*代理对象,银行工作人员
*/
public class Helper implement IHelp{
IHelp iHelp;
public Helper(Helper iHelp){
this.iHelp = iHelp;
}
@Override
public void help(){
System.out.println("办卡前查看用户的身份证信息等预处理操作");
iHelp.help();
System.out.println("办卡完成");
}
}
1
2
3
4
5
6
7
8
9
10
/**
*测试静态代理
*/
public class test{
public static void main(String[] args){
Man man = new Man();
Helper helper = new Helper(man);
helper.help();
}
}

以上就是静态代理一个简单的demo。

动态代理

动态代理涉及到了反射机制,在运行时生成代理对象。JDK已经给我们提供了一个便捷的动态代理接口 InvocationHandler,源码最终调用的是 Native 方法去生成我们的代理对象

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/**
* 动态代理设计模式
*/
public class HelperProxy implements InvocationHandler{
private Object object;
public HelperProxy(Object object){
this.object = object;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("办卡前查看用户的身份证信息等预处理操作");
Object result = method.invoke(object,args);
System.out.println("完毕");
return result;
}
}

1
2
3
4
5
6
7
8
9
10
11
/**
* 代理设计模式 - 测试
*/
public class Test {
public static void main(String[] args) {
Man man = new Man();
IHelper iHelp = (IHelper) Proxy.newProxyInstance(IHelper.class.getClassLoader(),
new Class<?>[]{IHelper.class}, new HelperProxy(man));// 获取代理实例
iHelp.help();
}
}

这里总结一下动态代理的步骤:

  1. 编写一个委托类的接口,即静态代理的(IHelper接口)
  2. 实现一个真正的委托类,即静态代理的(Helper类)
  3. 创建一个动态代理类,实现InvocationHandler接口,并重写该invoke方法
  4. 在测试类中,生成动态代理的对象。
------ 本文结束 ------

版权声明

文章作者: 周 康

发布时间: 2016年11月13日 - 00:11

原始链接: http://Kanging.github.io/2016/11/13/代理设计模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。