代理模式

来源:互联网 发布:华软市政软件 编辑:程序博客网 时间:2024/04/29 12:01

    代理模式是在不改变源码的情况下增加已有方法的功能。要使用代理模式的前提是:被代理的类实现了一个接口。代理模式分为静态代理模式与动态代理模式。

   静态代理模式:

          只是在实现与被代理类相同的接口,在代理对象力穿一个被代理类的对象。具体实现如下代码:

 

class ProxyList implements List<String>{List<String> target;public ProxyList(List<String> target) {this.target = target;}@Overridepublic boolean add(String e) {Thread t = Thread.currentThread();System.out.println("线程"+t.getName()+"调用add"); return target.add(e); }@Overridepublic void add(int index, String element) {// TODO Auto-generated method stub}@Overridepublic boolean addAll(Collection<? extends String> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean addAll(int index, Collection<? extends String> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic void clear() {// TODO Auto-generated method stub}@Overridepublic boolean contains(Object o) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean containsAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic String get(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic int indexOf(Object o) {// TODO Auto-generated method stubreturn 0;}@Overridepublic boolean isEmpty() {// TODO Auto-generated method stubreturn false;}@Overridepublic Iterator<String> iterator() {// TODO Auto-generated method stubreturn null;}@Overridepublic int lastIndexOf(Object o) {// TODO Auto-generated method stubreturn 0;}@Overridepublic ListIterator<String> listIterator() {// TODO Auto-generated method stubreturn null;}@Overridepublic ListIterator<String> listIterator(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean remove(Object o) {// TODO Auto-generated method stubreturn false;}@Overridepublic String remove(int index) {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean removeAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean retainAll(Collection<?> c) {// TODO Auto-generated method stubreturn false;}@Overridepublic String set(int index, String element) {// TODO Auto-generated method stubreturn null;}@Overridepublic int size() {// TODO Auto-generated method stubreturn 0;}@Overridepublic List<String> subList(int fromIndex, int toIndex) {// TODO Auto-generated method stubreturn null;}@Overridepublic Object[] toArray() {// TODO Auto-generated method stubreturn null;}@Overridepublic <T> T[] toArray(T[] a) {// TODO Auto-generated method stubreturn null;}}


上面的代码是list集合的一个静态代理类,在这个类力只是实现了一个add方法,其他方法只要增加一定的功能和调用target对象相应的方法就可以。

 

动态代理:

         java 提供了动态代理API:

           1     底层是利用反射实现的功能

           2     java 提供了API Proxy,动态的继承接口(被代理类所实现的接口),实现接口中所有的方法,当方法被调用时候,将调用请求转给调用处理器处理

           3     调用处理器,就可以处理所有的方法执行过程

    下面代码是list集合的动态代理的实现以及与之的实现:

  

public List proxy(final List list){//调用处理器InvocationHandler handler = new InvocationHandler() {//invoke 调用//当有方法被调用时候执行invoke 方法,// 参数proxy是代理对象, method正在执行的方法, args是调用方法传递的参数// 返回值是方法执行的结果@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {Thread t = Thread.currentThread();System.out.println("线程"+t.getName()+"调用"+method.getName());//根据业务规则决定是否执行 被代理方法 method.invoke(list, args);//在这里可以添加业务逻辑//if(没有授权) throw 权限不够异常//if(没有登陆) throw 需要登陆异常//方法调用之前的 可以添加逻辑Object val = method.invoke(list, args);//方法调用之后的 可以添加逻辑// 返回值太大 超过范围,抛出权限不够 。。。return val;}};/* * 创建代理类对象 * Proxy.newProxyInstance 根据接口  getClass.getClassLoader:获取一个类加载器(任何一个类加载器都可以), * new Class[]{List.class}:必须是接口 ,  handler :将一个处理器传给代理类,以便在代理类中调用handler中的invoke方法。    * List.class 创建对象,也就是实现了接口的全部方法 * 当调用了这些方法时候,就会执行 调用处理器中的 invoke方法,并且当前方法作为参数 method * 传递给 invoke 方法,在invoke方法可以利用 method.invoke()执行方法。 */List proxy = (List) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{List.class}, handler);return proxy;}}


测试代理类对象的方法:

 

public void testProxy3(){List<String> list = new ArrayList<String>();list = proxy(list);list.add("Tom");list.add("Jerry");list.remove("Tom");}


代理模式的图片分析:

 


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 鞋垫在鞋里老串怎么办 网贷已经借不到怎么办 骨龄比实际年龄大怎么办 小孩崴脚了肿了怎么办 报到证过期2年多怎么办 报到证过了期限怎么办 报到证超过两年怎么办 报到证过期4年了怎么办 学校没发报到证怎么办 未报到证过期了怎么办 专升本的报到证怎么办 蓝色报到证丢了怎么办 报到证用过了怎么办 大学报到证丢了怎么办 qq好被冻结了怎么办啊 qq突然被冻结了怎么办 扣扣密码被冻结怎么办 蠕动泵不抽水了怎么办 失眠多梦压力大怎么办 大福的皮硬了怎么办 安卓手机root失败怎么办 你的手机已root怎么办 移动网不能看片怎么办 网站的密码忘了怎么办 拍拍贷换手机了怎么办 六个半月的宝宝发烧怎么办 5个月的小孩发烧怎么办 3个月小孩发烧怎么办 2岁宝宝感冒发烧怎么办 2岁宝宝发烧38度怎么办 2岁宝宝反复发烧怎么办 八个月的孩子发烧怎么办 2岁宝宝咳嗽厉害怎么办 2岁宝宝睡觉咳嗽怎么办 2岁宝宝感冒咳嗽怎么办 2岁宝宝晚上咳嗽怎么办 1岁宝宝老便秘怎么办 2岁多宝宝老便秘怎么办 1岁半宝宝便秘怎么办 2岁宝宝拉稀黄水怎么办 二岁宝宝便秘该怎么办