java入门学习提升第十篇:ava代理——静态代理

今天要介绍的是一个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方法进行改造,比如需要统计唱歌和跳舞的次数,次数大于3则不进行该操作直接返回,这时候用代理就很好实现了,来把代理类稍作修改:

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.当被代理的类需要进行的扩展增多时,管理会变得更加困难,之后对被代理类的修改,需要同时修改代理类,增加了修改成本。

所以不要为了使用而使用,应用在合适的场景才能发挥它真正的作用。

至此,本篇讲解完毕,欢迎大家继续关注!

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容

  • 今天来看看另一个更加神奇的类——匿名内部类。 就像它的名字表示的那样,这个类是匿名的,用完之后,深藏功与名,就像扫...
    Python编程社区阅读 462评论 0 1
  • 【程序1】 题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔...
    开心的锣鼓阅读 3,311评论 0 9
  • 多态 任何域的访问操作都将有编译器解析,如果某个方法是静态的,它的行为就不具有多态性 java默认对象的销毁顺序与...
    yueyue_projects阅读 936评论 0 1
  • 总能看到一个中年男人,略带沧桑,穿着朴素,留着长发花白胡子,背着包,提两桶水,穿行而过。有几次我都想上前询问,却始...
    小石头的阅读 182评论 -1 1
  • 上周惩罚 给队友买了一双严选的棉拖。 本周计划回顾 上周的计划是:1.每天晚上11点30上床并且不玩手机(周一到周...
    孤二箔阅读 316评论 0 1