当前课程知识点:JAVA程序设计进阶 > 第八章 反射与代理机制 > 8.2 Java静态代理 > Video
这一节我们将介绍
JAVA的静态代理
那什么是代理
那就是在JAVA当中
我们有一些类或者一些对象
它不想被直接的访问或者控制
它通过中间的一个中介渠道
来进行访问或者控制
那代理这个概念
在我们的生活当中见的非常多
比如说你要打官司你请个律师
其实律师就是你的代理
你要买房子你没有空直接去
你找了一个中介
那这个中介就是你的代理
那在JAVA当中的话
那我们任何一个对象
都可以有自己代理
那只不过取决于说
你什么时候用什么时候不用
那代理模式的话
实际上它是指在某些情况下
我们的一个客户不想
或者不能直接引用
或者访问另外一个对象
而通过代理对象
可以在我们的客户端
和我们的目标对象之间
起到一个中介的作用
大家注意有时候可能说我一个
为什么用代理
那一种原因说我一个客户
就是说站在客户端角度
我不能引用这个对象
那为什么不能
也许是权限控制的原因
比如大家知道我们JAVA当中
访问权限过程中有
public protect default private
但有些时候
由于权限控制的原因
你客户端的对象
不能直接访问我们的目标对象
也许中过中间的一个中介
就能够起到这个作用
那这种代理模式的作用是
为其他对象提供一种代理
来去控制或者访问
我们的目标对象
大家可以看一下我们PPT上这个图
上面左上角是一个Client
它要调用我们目标对象request方法
那request方法时候
你要调它的时候
大家可以在底下实践端的话
我们底下的左下角
是一个ProxySubject
也就是说是一个代理的一个对象
然后代理对象实际上
它和我们右下角的
RealSubject
真实对象拥有同样的访问接口
只不过是它可能
还要做一些其他的事情
那我们看看这个代理模式
一般都会涉及到哪些角色
第一个角色是抽象的角色
也就是说声明真实对象
和代理对象的共同接口
那这里面它就会描述着说
我这个真实对象和代理对象
它都能够提供哪些方法
那我们第二个角色是代理角色
那这个代理角色
它的内部它包含了
对真实对象的一个引用
所以它可以去操作
或者控制我们真实对象
而且我们的代理对象
与我们的真实对象
提供了是相同的这么一个接口
这样会可以方便它在任何时候
都可以去代替我们的真实对象
此外我们的代理对象
还可以在执行真实对象的
操作的时候附加了其他的操作
这相当于对我们真实对象
进行了一次封装
其实你可以理解为说
我们代理对象它还可以做的更多
它可以在调用我们
真实对象这个方法的时候
前面做一些铺垫
后面做一些后处理
那我们第三个角色是真实角色
也就是说我们代理的角色
所代表的真实对象
是我们最终要引用的对象
这个就是真实角色
我们来看一下
静态代理的一个例子吧
首先第一部分
是要描述我们的真实对象
和代理对象它的共同的接口
我们这里是用了一个
抽象类来表示的
abstract class
它是一个抽象类
类的名字叫Subject
而这类里面有一个抽象方法
public abstract void request
只有一个方法
名字叫请求request
好了这个共同接口描述完了
我们再看一下第二部分
是我们真实的角色类
class RealSubject extends subject
然后我们定了一个类叫 RealSubject
它继承于我们刚才那抽象的类
那你既然继承了抽象类的话
我们要把它的这些
抽象方法给实现了
那它唯一的抽象方法就是
public void request
而我们里面打印
System.out.println
(“From Real Subject”)
它的功能就只是显示说
我是从来自于我的真实角色
真实对象当中
好我们再看一下第三部分
我们的客户端
public class Client
里面定了主方法
主方法里面声明了subject
这个类的一个对象
subject subject=new ProxySubject
大家看看等号右边有一个
新的一个类名叫
ProxySubject代理对象
然后subject.request
调用代理对象的request方法
那这个代理对象 ProxySubject
到底有什么功能
我们接着往下看
class ProxySubject extends Subject
这个ProxySubject它还是
继承于我们抽象类subject
然后首先它有个成员变量
private realSubject realSubject
它实际上是拥有了
对真实对象的一个引用
而且还是私有的private
大家看到没有
它是把RealSubject
这个对象它是定义成private
也就是说只有它ProxySubject
这个类才能访问
好我们再看一下
这个request方法
public void request
request方法里面
首先是pre Request
我们说它是在
进行真实角色的操作前
它先附加一些操作
是pre Request然后紧接着
if(null==realSubject)
也就是说
我真实的这个对象是不是空呢
如果没有这个真实对象的话
那我就要实例化构造一个出来
所以realSubject=new RealSubject
紧接着在对调用
realSubject request方法
那调用request方法了以后
我们下面又来一个postRequest
这是在真实角色操作之后
附加这个操作
那大家可以看到
我们目前正在定义着这个request方法
就public void request方法
实际上它是属于
ProxySubject里边的request方法
但在实现request方法过程中
我们之前先加一步叫pre Request
然后中间才是真正去调用
我们的realSubject request方法
后面又加了一步post Request这个方法
那至于这个pre Request方法
和post Request方法
实际上在我们这里
是一个模拟的一些操作
大家往下看
private void pre Request
我们打印出来说pre Request
也就是说我们pre Request这个方法
只是模拟说我做了一个
之前的一个铺垫的动作
再往下
privote void postRequest
然后它的实现的功能是
打印出来post Request
也就是说我打印出做一些后处理
这些后处理
那实际上这个例子想告诉大家
就是说对于我们的代理角色
ProxySubject你除了可以调用
我们真实角色的方法之外
你还可以做一些额外的动作
包括前面的铺垫
包括后面的后处理
然后你的这个ProxySubject
也就是你的代理角色
你提供的方法是一样的
就是说是privote void Request
方法名字一样的
但这个同样的方法名
它里面做的这个操作
又比我们真实方法的request方法
又多了一些
所以这是代理角色的好处
那我们看一下这个叫静态代理
刚才我们这个方式叫静态代理
那静态代理的话
它都有一些什么优缺点
我们先看优点
那对于我们的业务类的话
只需要关注业务逻辑本身
这个保证业务类重用性
这是代理的共同的一些优点
那缺点是什么
那缺点就是说
我们代理对象的一个接口
只服务于一个类型的服务
如果我们要代理的方法很多
势必要为每一种方法进行代理
那这个时候我们写程序的话
就会比较麻烦
大家想想刚才那个例子
那刚才例子实际上
只是代理request这个方法
那我们要写这个代码了
那如果我们原来接口当中
是不光光定义了request这个方法
还定了其他一堆方法的话
那我们每一个方法
你都要稍微给它重新实现
然后加上预处理
加上后面的后处理
所以这个用起来比较麻烦
第二个缺点是说
如果我们共同的接口当中
增加了一个方法
就是说你沿着
你的代理的这个类
也都选好了以后
我那个接口又想
增加了一个方法
那这样除了所有实现类
都要实现这个方法外
其他代理类也需要
实现这个方法
那这样的话我们整个代码的
维护复杂度就会提升
所以这是静态代理的优缺点
优点是简单明确
缺点是你要做很多的工作
而且代码维护量比较大
所以这一节我们是
JAVA静态代理的优缺点
和做法都给大家介绍清楚了
-1.0 导学
--Video
-1.1 线程的基本概念
--Video
-1.1 线程的基本概念--作业
-1.2 通过Thread类创建线程
--Video
-1.2 通过Thread类创建线程--作业
-1.3 线程的休眠
--Video
-1.3 线程的休眠--作业
-1.4 Thread类详解
--Video
-1.5 通过Runnable接口创建线程
--Video
-1.5 通过Runnable接口创建线程--作业
-1.6 线程内部的数据共享
--Video
-2.0 导学
--Video
-2.1 线程同步的思路
--Video
-2.2 线程同步的实现方式—Synchronization
--Video
-2.3 线程的等待与唤醒
--Video
-2.4 后台进程
--Video
-2.5 线程的生命周期与死锁
--Video
-2.6 线程的调度
--Video
-3.0 导学
--Video
-3.1 线程安全与线程兼容与对立
--Video
-3.2 线程的安全实现-互斥同步
--Video
-3.3 线程的安全实现-非阻塞同步
--Video
-3.4 线程的安全实现-无同步方案
--Video
-3.5 锁优化
--Video
-4.0 导学
--Video
-4.1 URL对象
--Video
-4.2 URLConnection对象
--Video
-4.3 Get请求与Post请求
--Video
-4.4 Socket通信原理
--Video
-4.5 Socket通信实现
--Video
-5.0 导学
--Video
-5.1 Socket 多客户端通信实现
--Video
-5.2 数据报通信
--Video
-5.3 使用数据报进行广播通信
--Video
-5.4 网络聊天程序
--Video
-6.0 导学
--Video
-6.1 Java虚拟机概念
--Video
-6.2 Java虚拟机内存划分
--Video
-6.3 Java虚拟机类加载机制
--Video
-6.4 判断对象是否存活算法及对象引用
--Video
-6.5 分代垃圾回收
--Video
-6.6 典型的垃圾收集算法
--Video
-6.7典型的垃圾收集器
--Video
-7.0 导学
--Video
-7.1 集合框架与ArrayList
--Video
-7.2 LinkedList
--Video
-7.3 HashMap与HashTable
--Video
-7.4 TreeMap与LinkedHashMap
--Video
-7.5 HashSet
--Video
-8.0 导学
--Video
-8.1 Java反射机制
--Video
-8.2 Java静态代理
--Video
-8.3 Java动态代理
--Video
-8.4 Java 反射扩展-jvm加载类原理
--Video
-8.5 Java进阶课程总结
--Video