设计模式之代理模式之二(Proxy)
from://http://www.cnblogs.com/xwdreamer/archive/2012/05/23/2515306.html
设计模式之代理模式之二(Proxy)
0.前言
在前面一篇博客设计模式之代理模式(Proxy)中我们已经讲解了一部分代理模式,下面我们继续讲解代理的有关内容,包括代理的分类以及java中的代理。
1.代理的分类
事实上代理能够被分为很多种类,大致有如下这些:虚代理、远程代理、copy-on-write代理、保护代理、Cache代理、防火墙代理、同步代理、智能指引。在这里我们会介绍虚代理和保护代理。
在设计模式之代理模式(Proxy)中提到的代理就是一个典型的虚代理的实现。起初每个代理对象只有用户编号和姓名数据,直到需要的时候,才会把整个用户的数据装载到内存中来。也就是说,要根据需要来装载整个UserModel的数据,虽然用户数据对象时前面已经创建好了的,但是只有用户编号和姓名的数据,可以看成是一个“虚”的对象,知道通过代理把所有的数据都设置好,才算是一个完整的用户数据对象。
保护代理是一种控制对原始对象访问的代理,多用于对象应该有不同的访问权限的时候。保护代理会检查调用者是否具有请求所必需的访问权限,如果没有相应的权限,那么就不会调用目标对象,从而实现对目标对象的保护。
2.java中的代理
2.1静态代理
通常把前面自己实现的代理模式成为Java的静态代理。这种实现方式有一个较大的缺点,就是如果Subject接口发生变化,那么代理类和具体的目标实现类都要变化,不是很灵活。而使用Java内建的对代理模式支持的功能来实现则不需要修改代理类。静态代理的代码实例如下所示:
(1)创建Subject接口
public interface Subject {
public String say(String name,int age);
}
(2)创建具体的目标实现类RealSubject

package edu.sjtu.erplab.proxy3;
public class RealSubject implements Subject {
@Override
public String say(String name, int age) {
// TODO Auto-generated method stub
return "姓名:"+name+",年龄:"+age;
}
}

(3)创建代理类Proxy,代理类中有具体目标实现类的引用

package edu.sjtu.erplab.proxy3;
public class Proxy implements Subject {
private RealSubject realSubject=null;
public Proxy(RealSubject realSubject)
{
this.realSubject=realSubject;
}
@Override
public String say(String name, int age) {
//在转调具体的目标对象之前,可以执行一些功能处理,比如权限判断
//转调具体的目标对象
return realSubject.say(name, age);
//在转调具体的目标对象之后,可以执行一些功能处理
//这也是代理模式的核心
}
}

(4)创建客户端测试代理模式

package edu.sjtu.erplab.proxy3;
public class Client {
public static void main(String[] args) {
// TODO Auto-generated method stub
Subject sub=new Proxy(new RealSubject());
String info=sub.say("xuwei", 25);
System.out.println(info);
}
}

2.2动态代理
通常把使用Java内建的对代理模式支持的功能来实现的代理成为动态代理。动态代理跟静态代理相比,明显的变化是:静态代理实现的时候,在Subject接口上定义很多的方法,代理类里面自然也要实现很多方法;而动态代理的时候,在Subject接口上定义了许多方法,但是动态代理类始终只有一个invoke方法和对象绑定方法。这样,当Subject接口发生变化的时候,动态代理的接口就不需要跟着变化了。
Java的动态代理只能代理接口,基本的实现是依靠Java的反射机制和动态生成class的技术,来动态生成被代理的接口的实现对象。动态代理的代码实例如下。
第(1)步和第(2)步同上述2.1中的静态代理。这里不再赘述。
(3)定义一个实现InvocationHandler接口的动态代理类MyInvocationHandler,以完成代理的具体操作

package edu.sjtu.erplab.dynamicproxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays; public class MyInvocationHandler implements InvocationHandler { private Object obj;//代理中含有具体实现类的引用
public Object bind(Object obj) {//绑定具体实现类
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
.getClass().getInterfaces(), this);//获取代理对象
} @Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {//动态调用方法 System.out.println(proxy.getClass());//class $Proxy0
System.out.println(method.getName());//say
System.out.println(Arrays.toString(args));//[xuwei, 25] Object temp=method.invoke(this.obj, args);//调用方法,传入具体对象和参数
return temp;//返回方法的返回信息。
}
}

(4)创建客户端测试代理模式

package edu.sjtu.erplab.dynamicproxy;
public class DynamicProxyDemo {
public static void main(String[] args) {
//实例化代理操作类
MyInvocationHandler hander=new MyInvocationHandler();
//绑定实际对象
Subject sub=(Subject) hander.bind(new RealSubject());
String info=sub.say("xuwei", 25);
System.out.println(info);
}
}

输出结构
class $Proxy0
say
[xuwei, 25]
姓名:xuwei,年龄:25
设计模式之代理模式之二(Proxy)的更多相关文章
- Java设计模式:代理模式(二)
承接上文 三.计数代理 计数代理的应用场景是:当客户程序需要在调用服务提供者对象的方法之前或之后执行日志或者计数等额外功能时,就可以用到技术代理模式.计数代理模式并不是把额外操作的代码直接添加到原服务 ...
- C#设计模式之代理模式(二)
15.3 代理模式应用实例 下面通过一个应用实例来进一步学习和理解代理模式. 1. 实例说明 某软件公司承接了某信息咨询公司的收费商务信息查询系统的开发任务,该系统的基本需 ...
- C#设计模式(13)——代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- C#设计模式:代理模式(Proxy Pattern)
一,什么是C#设计模式? 代理模式(Proxy Pattern):为其他对象提供一种代理以控制对这个对象的访问 二,代码如下: using System; using System.Collectio ...
- 乐在其中设计模式(C#) - 代理模式(Proxy Pattern)
原文:乐在其中设计模式(C#) - 代理模式(Proxy Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 代理模式(Proxy Pattern) 作者:webabcd 介绍 为 ...
- C#设计模式(13)——代理模式(Proxy Pattern)(转)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- 设计模式 - 代理模式(Proxy Pattern)
一.引言 在软件开发过程中,有些对象有时候会由于网络或其他的障碍,以至于不能够或者不能直接访问到这些对象,如果直接访问对象给系统带来不必要的复杂性,这时候可以在客户端和目标对象之间增加一层中间层,让代 ...
- 夜话JAVA设计模式之代理模式(Proxy)
代理模式定义:为另一个对象提供一个替身或者占位符以控制对这个对象的访问.---<Head First 设计模式> 代理模式换句话说就是给某一个对象创建一个代理对象,由这个代理对象控制对原对 ...
- Java设计模式之代理模式(静态代理和JDK、CGLib动态代理)以及应用场景
我做了个例子 ,需要可以下载源码:代理模式 1.前言: Spring 的AOP 面向切面编程,是通过动态代理实现的, 由两部分组成:(a) 如果有接口的话 通过 JDK 接口级别的代理 (b) 如果没 ...
随机推荐
- 10 Go 1.10 Release Notes
Go 1.10 Release Notes Introduction to Go 1.10 Changes to the language Ports Tools Default GOROOT &am ...
- Go语言之Windows 10开发工具LiteIDE初步使用
Intel Core i5-8250U,Windows 10家庭中文版,go version go1.11 windows/amd64,LiteIDE X34.1 在RUNOOB.COM的Go语言教程 ...
- TcxGrid标题头 字体加粗
- 【BZOJ】4025: 二分图
题解 lct维护一个结束时间作为边权的最大生成树,每次出现奇环就找其中权值最小的那条边,删掉的同时还要把它标记上,直到这条边消失 如果有标记则输出No 边权通过建立虚点来维护 代码 #include ...
- Codeforces Round #475 (Div. 2) D. Destruction of a Tree
题意:给你一棵树, 只能删度数为偶数的点, 问你能不能将整个图删完, 如果能输入删除的顺序. 思路:对于一棵树来说, 如果里面的点的个数是偶数个则肯定不可能, 偶数个点有奇数条边,而你每次删只能删偶数 ...
- 踩过无数坑实现的哈夫曼压缩(JAVA)
最近可能又是闲着没事干了,就想做点东西,想着还没用JAVA弄过数据结构,之前搞过算法,就试着写写哈夫曼压缩了. 本以为半天就能写出来,结果,踩了无数坑,花了整整两天时间!!orz...不过这次踩坑,算 ...
- 贝壳找房魔法师顾问[并查集+DAG判断]
题目链接[https://nanti.jisuanke.com/t/27647] //计蒜客2018复赛D题,想简单了. 题解: 题目是中文的,不再赘述. 题解: 分为三种情况:1.两个字符串都不能变 ...
- Cmd2001的毒瘤水题题解
怕不是我再不写题解这题就该成没人做也没人会的千古谜题了...... T1: 仔细分析题面,发现相同就是广义SAM上节点相同,相似就是广义SAM上为从根到某个点路径的前缀..直接SAM上跑从根开始,每个 ...
- BZOJ.2246.[SDOI2011]迷宫探险(DP 记忆化搜索 概率)
题目链接 求最大的存活概率,DP+记忆化. 用f[s][x][y][hp]表示在s状态,(x,y)点,血量为hp时的存活概率. s是个三进制数,记录每个陷阱无害/有害/未知. 转移时比较容易,主要是在 ...
- QThreadPool线程池的使用,线程与Widget通过信号与槽的方式通信。
因为QRunnable类并非继承自QObject,不能使用信号和槽,为了能够使用信号与槽和Widget通信,需要对QRunnable进行封装. 定义一个类QMyRunnable,该类首先继承自QObj ...