【Java入门提高篇】Day10 Java代理——静态代理
今天要介绍的是一个Java中一个很重要的概念——代理。
什么是代理?联系生活想想看,代理似乎并不陌生,最形象的代表便是经纪人,明星一般都有经纪人,经纪人作为中间人,负责代理明星的相关事宜,比如说,有人要请明星去唱歌表演,一般不会直接跟明星联系,而是联系他的经纪人,他的经纪人来负责安排行程,而真正唱歌表演的还是明星本人,经纪人仅仅作为一个附加物存在。
在Java中,代理也是这样的概念,来看个栗子:
先来创建一个明星类Stars:
public class Stars implements IStars{
private String name; public Stars(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public void sing(){
System.out.println(getName() + " 唱了一首歌.");
} public void dance(){
System.out.println(getName() + " 跳了一支舞.");
}
}
这是相应的接口:
public interface IStars {
void sing();
void dance();
}
现在创建一个代理类:
public class StarsProxy implements IStars{
//保存接收的代理对象
private IStars stars; public StarsProxy(IStars stars){
this.stars = stars;
} @Override
public void sing() {
System.out.println("我是代理,我收到了唱歌请求。");
stars.sing();
System.out.println("唱歌完毕");
} @Override
public void dance() {
System.out.println("我是代理,我收到了跳舞请求。");
stars.dance();
System.out.println("跳舞完毕");
}
}
来测试一下:
public class Test {
public static void main(String[] args){
//创建目标对象
IStars stars = new Stars("Frank");//代理对象,把目标传给代理对象,建立关系
IStars starsProxy = new StarsProxy(stars);
starsProxy.sing();
starsProxy.dance();
}
}
运行结果:
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了跳舞请求。
Frank 跳了一支舞.
跳舞完毕
我们可以看到,实际上代理类只是保存了Stars类的一个实例,因为实现的是相同的接口,StarsProxy类必须实现需要代理的Stars类的方法,比如这里的dance和sing,而这个接口正是链接两者的关键,因为实现接口就代表必定存在接口中声明的方法。
那么,为什么要使用代理呢?
其实主要目的是为了扩展原有类的功能,想想看,如果那个Stars类不是你写的,而是别人写的,现在要将原有的sing或者dance方法进行改造,比如需要统计唱歌和跳舞的次数,次数大于10则不进行该操作直接返回,这时候用代理就很好实现了,来把代理类稍作修改:
public class StarsProxy implements IStars{
//保存接收的代理对象
private IStars stars;
//保存sing和dance的次数
private int num; public StarsProxy(IStars stars){
this.stars = stars;
} @Override
public void sing() {
if (!ifWork()) {
return;
}
System.out.println("我是代理,我收到了唱歌请求。");
stars.sing();
System.out.println("唱歌完毕");
} @Override
public void dance() {
if (!ifWork()) {
return;
}
System.out.println("我是代理,我收到了跳舞请求。");
stars.dance();
System.out.println("跳舞完毕");
} /**
* 是否继续工作
* @return 是返回true,否则返回false
*/
private boolean ifWork(){
if (num > 3){
System.out.println("明星今天已经很累了,明天再来吧。");
return false;
}else {
num++;
return true;
}
}
}
修改一下测试类:
public class Test {
public static void main(String[] args){
//创建目标对象
Stars stars = new Stars();
stars.setName("Frank"); //代理对象,把目标传给代理对象,建立关系
StarsProxy starsProxy = new StarsProxy(stars);
for (int i = 0;i < 5; i++){
starsProxy.sing();
}
}
}
测试结果如下:
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
我是代理,我收到了唱歌请求。
Frank 唱了一首歌.
唱歌完毕
明星今天已经很累了,明天再来吧。
看,简单粗暴。
但其实并没有多少干货,这里仅仅是一种代理的思想,用这种思想可以比较方便的在不直接修改原有类的前提下对原有类的方法进行扩展。为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用委托类对象的地方都可以用代理对象替代。代理类负责请求的预处理、过滤、将请求分派给委托类处理、以及委托类执行完请求后的后续处理。可以使业务类只关注业务逻辑本身,保证了业务类的重用性,这也是代理的共有优点。
但是限制也显而易见:
1.代理类需要跟被代理类实现相同的接口,这样才能一起向上转型后实现多态。
2.当被代理的类需要进行的扩展增多时,管理会变得更加困难,之后对被代理类的修改,需要同时修改代理类,增加了修改成本。
所以不要为了使用而使用,应用在合适的场景才能发挥它真正的作用。
至此,本篇讲解完毕,欢迎大家继续关注!
【Java入门提高篇】Day10 Java代理——静态代理的更多相关文章
- 【Java入门提高篇】Java集合类详解(一)
今天来看看Java里的一个大家伙,那就是集合. 集合嘛,就跟它的名字那样,是一群人多势众的家伙,如果你学过高数,没错,就跟里面说的集合是一个概念,就是一堆对象的集合体.集合就是用来存放和管理其他类对象 ...
- 【Java入门提高篇】Day11 Java代理——JDK动态代理
今天来看看Java的另一种代理方式--JDK动态代理 我们之前所介绍的代理方式叫静态代理,也就是静态的生成代理对象,而动态代理则是在运行时创建代理对象.动态代理有更强大的拦截请求功能,因为可以获得类的 ...
- 【Java入门提高篇】Day12 Java代理——Cglib动态代理
今天来介绍另一种更为强大的代理——Cglib动态代理. 什么是Cglib动态代理? 我们先回顾一下上一篇的jdk动态代理,jdk动态代理是通过接口来在运行时动态创建委托类的代理对象,但是跟静态代理一样 ...
- 【Java入门提高篇】Day1 抽象类
基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...
- 【Java入门提高篇】Day13 Java中的反射机制
前一段时间一直忙,所以没什么时间写博客,拖了这么久,也该更新更新了.最近看到各种知识付费的推出,感觉是好事,也是坏事,好事是对知识沉淀的认可与推动,坏事是感觉很多人忙于把自己的知识变现,相对的在沉淀上 ...
- 【Java入门提高篇】Day21 Java容器类详解(四)ArrayList源码分析
今天要介绍的是List接口中最常用的实现类——ArrayList,本篇的源码分析基于JDK8,如果有不一致的地方,可先切换到JDK8后再进行操作. 本篇的内容主要包括这几块: 1.源码结构介绍 2.源 ...
- 【Java入门提高篇】Day16 Java异常处理(下)
今天继续讲解java中的异常处理机制,主要介绍Exception家族的主要成员,自定义异常,以及异常处理的正确姿势. Exception家族 一图胜千言,先来看一张图. Exception这是一个父类 ...
- 【Java入门提高篇】Day31 Java容器类详解(十三)TreeSet详解
上一篇很水的介绍完了TreeMap,这一篇来看看更水的TreeSet. 本文将从以下几个角度进行展开: 1.TreeSet简介和使用栗子 2.TreeSet源码分析 本篇大约需食用10分钟,各位看官请 ...
- 【Java入门提高篇】Day28 Java容器类详解(十)LinkedHashMap详解
今天来介绍一下容器类中的另一个哈希表———>LinkedHashMap.这是HashMap的关门弟子,直接继承了HashMap的衣钵,所以拥有HashMap的全部特性,并青出于蓝而胜于蓝,有着一 ...
- 【Java入门提高篇】Day27 Java容器类详解(九)LinkedList详解
这次介绍一下List接口的另一个践行者——LinkedList,这是一位集诸多技能于一身的List接口践行者,可谓十八般武艺,样样精通,栈.队列.双端队列.链表.双向链表都可以用它来模拟,话不多说,赶 ...
随机推荐
- HTML出现错位的问题
引起网页HTML显示错位的几个常见问题: 1.在HTML代码中缺失元素的开始或结束标签 2.CSS设置中对边界.填充或边框的设置超出了父级容器的范围 3.CSS和HTML的编码不统一 4.浏览器的解析 ...
- J-Link驱动下载和Hex程序下载
J-LINK驱动下载 1.首先拥有硬件J-Link硬件. 2.安装J-Link驱动程序SEGGER 下载地址如下 https://www.segger.com/downloads/jlink/JLin ...
- div内长串数字或字母不断行处理
比如: <div>1111tryrt645645rt4554111112324353453454364</div> <div>qwewretrytuytuiyiuo ...
- codefoces384A-Mafia心得
题目描述:One day n friends gathered together to play "Mafia". During each round of the game so ...
- Transact-SQL知识点梳理
Transact-SQL基础语言 运行环境:SQL Server 语法约定: 语法约定 用途说明 大写字母 Transact-SQL关键字 斜体 用户提供的Transact-SQL语法参数 粗体 数据 ...
- 【python】Python的单例模式
原文:http://blog.csdn.net/ghostfromheaven/article/details/7671853 单例模式:保证一个类仅有一个实例,并提供一个访问他的全局访问点. 实现某 ...
- JavaScript数据可视化编程学习(二)Flotr2,雷达图
一.雷达图 使用雷达图显示多维数据. 如果你有多维的数据要展示,那么雷达图就是一种非常有效的可视化方法. 由于雷达图不常用,比较陌生,所以向用户解释的时候有一些难度.注意使用雷达图会增加用户认知负担. ...
- Python 面向对象(二) 特殊方法
一些Python特殊方法的汇总 __bases__ 类的基类,返回元祖__base__ 类的基类,也叫父类__call__ '类名()',类名加括号调用时执行的语句__class__ 对象或类 ...
- 开源项目 log4android 使用方式详解
话不多说, 直接上主题. log4android 是一个类似于log4j的开源android 日志记录项目. 项目基于 microlog 改编而来, 新加入了对文件输出的各种定义方式. 项目地址: 点 ...
- Linq学习系列-----1.1 Lambda表达式介绍
1.1 Lambda表达式介绍 下图就是一个典型的Lambda表达式. instance:输入参数 =>:Lambda操作符 instance.MemoryCount>=20*1024 ...