当前课程知识点:JAVA程序设计进阶 >  第八章 反射与代理机制 >  8.2 Java静态代理 >  Video

返回《JAVA程序设计进阶》慕课在线视频课程列表

Video在线视频

Video

下一节:Video

返回《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静态代理的优缺点

和做法都给大家介绍清楚了

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

第六章 Java虚拟机

-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

第七章 深入集合Collection

-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

Video笔记与讨论

也许你还感兴趣的课程:

© 柠檬大学-慕课导航 课程版权归原始院校所有,
本网站仅通过互联网进行慕课课程索引,不提供在线课程学习和视频,请同学们点击报名到课程提供网站进行学习。