浅谈java的静态代理模式

        嗨喽~小伙伴们XX好呀,  

        本章我们来介绍,java中出现的静态代理模式

        代理,对应于英语单词-----Proxy,从字面上理解,就是在实现代理目标(Target)所有的需求的同时,还能够实现代理目标无法做到的事情,比如为目标添加审查和监控功能,主要包括前置处理后置处理

        读完上面这段话,小伙伴们可能有点懵,咱从网上找到了一个典型的例子,在这分享给大家,请大家从下面的例子中细细体会:

        话说啊我们可爱的小明同志马上就要结婚啦,可是,许多的琐事诸如场地布置,鲜花摆放,婚礼流程等等,他自己操办不过来,于是,他找到了一家婚庆公司,由婚庆公司代替他去操办所有的琐事,而他自己,只需要专注于自己的事情就行了(比如努力工作挣足够的钱来办婚礼^_^)。这样一个浅显的例子,咱可以用一段代码描述:



public class Wedding {
    public static void main(String[] args) {
        //小明----真实角色
        Marry xiaoming = new XiaoMing();
        //婚庆公司----代理角色
        Marry marryCompany = new MarryCompany(xiaoming);
        //用婚庆公司的marry()方法代替小明的marry()方法
        marryCompany.marry();
    }
}

//结婚接口
interface Marry{
    void marry();
}

//小明----真实角色
class XiaoMing implements Marry{
    //小明应该做的事情
    @Override
    public void marry() {
        System.out.println("小明结婚啦~");
    }
}


//婚庆公司----代理角色
class MarryCompany implements Marry{
    private Marry target; //要代理的真实角色(比如小明)
    public MarryCompany(Marry target){
        this.target = target;
    }
    @Override
    public void marry() {
        //前置处理
        before(); //代理角色不同于真实角色的新功能
        //代理目标该做的事情
        this.target.marry();
        //后置处理
        after(); //代理角色不同于真实角色的新功能
    }
    private void before() {
        System.out.println("布置场地和鲜花~");
    }
    private void after() {
        System.out.println("小明该付尾款了~");
    }
}

        这段代码使用了静态代理模式,简单说来,使用代理,有以下优点:

        1. 代理对象可以做许多代理目标做不到的事情(比如本例子中的场地布置,鲜花摆放,婚礼流程等等)

        2. 代理目标可以只专注于自己的事情。(比如本例子中,小明只需要考虑挣够钱来还尾款)

        在这,我们扩展一点点知识,上面代码段里,有如下代码:


//婚庆公司----代理角色
Marry marryCompany = new MarryCompany(xiaoming);
        
//用婚庆公司的marry()方法代替小明的marry()方法
marryCompany.marry();

        咱可以使用匿名的方式,将两句合为一句,用一个图来说明:

​​​​​​​​​​​​​​ 

        其实,之所以介绍代理方面的知识,是为了引出接下来的东西,

        我们来看一看JDK里关于Thread类的一段源码:

        显然,这是Thread类的某一个构造方法,细心的小伙伴们可能看到了熟悉的“target”字样!没错!!!这个构造方法便是使用了代理模式编写, 如果你已经对上面那个例子中的代码比较熟悉,那么对于下图中所表示的Java线程启动方式就有了更深刻的理解了:

        (图中的NewThread实现了Runnable接口)

        甚至,结合Lambda表达式,小伙伴们也能够看懂下面的代码:

  new Thread( () -> System.out.println("我是易果啥笔") ).start();

        如果小伙伴们没学过Lambda表达式的话,可以参考我的另一篇博文:

        java是如何简化成一行代码的?-----Lambda表达式初识​​​​​​​ 

        代理模式也是设计模式的一种。 了解代理模式的特点,有助于我们理解一些底层原理的实现

        最后喜欢的小伙伴们点个赞鼓励支持一下吧~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

易果啥笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值