Java静态代理

疑惑?

1.为什么要写这篇文章
2.为什么要使用静态代理以及好处

为什么要写这篇文章

在google百度输入Java代理,会出来各种分析Java代理的文章,尤其是排名靠前的几篇分析的特别透彻,而我还写关于Java代理的文章似乎已经没有意义了,其实,并不是这样的,我觉得开始做任何事,一开始的心态要摆正,不然是不能坚持下去的,写文章最大的好处是让自己慢慢学会自律,在这过程中无论是在技术上还是文笔表达上都会有质的飞跃,对自己的提升是非常有帮助的,因为是刚开始写文章嘛,而且技术还在提升中,可能对某些东西的理解还不能很深入。但总得慢慢来嘛,有一句俗话说的好!“猥琐发育!别浪!” ,对!现在正是发育的时候,少漏点刀,多刷野。当写完这篇文章时,我想我会对Java代理模式的理解会更加深入。

为什么要使用静态代理以及好处

举个过滤自来水的例子,因为自来水本身是比较脏的,我们一般不会直接接自来水喝,但是我们可以通过自来水过滤器来让自来水变成能喝的水。下面是这个例子的代码实现。

定义一个公共接口,作用嘛!有一大堆理论,什么面向抽象编程啦!面向接口编程啦!依赖倒转原则啊,两个类尽量别产生直接关系,通过第三方抽象产生依赖~~~ 这些东西需要有一定代码量,自然而然的就能明白,到那时你就会感觉使用接口有种预知未来的感觉,对于初学者不用着急着理解接口的含义,不理解先放放,没事。

interface Water{
        void getWater();
    }

定义一个自来水类(也就是委托类(也就是被代理的类))实现Water接口中getWater()方法,那么就代表这个类有了获取水的能力,但是这个水是没有处理过的,不能直接饮用。

public class TapWater implements Water{
        public void createWater(){
            System.out.println("自来水有点脏!");
        }
    }

定义一个过滤自来水的类TapWaterFilter(也就是代理类)也是实现Water中getWater()方法,同样也有获取水的能力,只是这个水是经过处理的水可以直接饮用。

public class TapWaterFilter implements Water{
        private Water mWater;
        
        TapWaterFilter(Water water){
            this.mWater = water;
        }

        public void getWater(){
            System.out.println("去超市买明矾,半透膜...");
            mWater.createWater();
            System.out.println("通过半透膜法、沉淀法、吸附法过滤,自来水变纯净水...");
        }
    }

客户端的使用如下:

public static void main(String[] args){
        TapWater tapWater = new TapWater();
        TapWaterFilter tapWaterFilter = new TapWaterFilter(tapWater);
        tapWaterFilter.createWater();
    }

因为例子比较简单,可能有人会说干嘛这么麻烦,直接改自来水类不来得更实在嘛,干啥还要定义一个TapWaterFilter类拐弯抹角的过滤自来水。

static class TapWater implements Water{
        public void createWater(){
            System.out.println("去超市买明矾,半透膜...");
            System.out.println("自来水有点脏!");
            System.out.println("通过半透膜法、沉淀法、吸附法过滤,自来水变纯净水...");
        }
    }

像上面这么改,直接改自来水类中的getWater()方法,不使用TabWaterFilter处理自来水,从设计模式元则上来分析缺点有

1.破坏了单一职责元则

我在写代码的时候,当发现自己写的函数特别臃肿,复用性差,查看整个类,发现好多地方都是重复代码时,我会考虑去重构某些函数,首先就会去考虑这个函数是否越职能了,它是否完成多项功能,这样的话,就有必要把这个多余的功能单独抽出来写一个函数,像上面的例子直接改自来水类(TapWater)中的getWater()方法,也就直接让getWater负责多项职能了,但是你可能会说过滤自来水(TapWaterFilter)类不就是处理多项职能了吗,但是别忘了,这个类是TapWater的代理类,起到方法增强的功能,为了不破坏TapWater中getWater单一职责元则,我们才这样设计TapWaterFilter中的getWater,并且他的核心职能也只有一个,那就是造出纯净水,只有这样,当我们还需使用自来水浇花时我们会庆幸当初没有让TapWater中的getWater造出纯净水来,而是使用代理类来完成这项职能。

2.违背了开闭元则

开闭元则是这样定义的,对扩展开放,对修改关闭,相当抽象,但是这两句话高度概括了设计模式的目的,我们之所以使用设计模式,无非就是设计一个可轻易扩展,让模块与模块之间可使用组装式的方式来产生联系。
代理模式正是遵循了这一元则,它并未产生对原来代码的修改,客户端的代码是原封未动的,并且它扩展了原来代码的功能。

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

推荐阅读更多精彩内容

  • 一、代理概念 为某个对象提供一个代理,以控制对这个对象的访问。 代理类和委托类有共同的父类或父接口,这样在任何使用...
    wyatt_plus阅读 787评论 0 5
  • 首先这个代理并不是网络层的那个代理,是一种设计模式,前天在看一篇Retrofit解析的文章时讲到一点:Retrof...
    EasonDev阅读 5,798评论 2 1
  • 作者: 一字马胡 转载标志 【2017-11-03】 更新日志 Java静态代理 代理,即是将自己需要做的一些事...
    一字马胡阅读 2,227评论 0 15
  • 最近在学习Java反射的一些知识,看到了一些有关代理的例子,好记性不如烂笔头,所以这里将它记录下来。接下来话不多说...
    BrightLoong阅读 7,861评论 4 18
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,633评论 18 139