静态代理概述

静态代理

public class StaticProxy {
    public static void main(String[] args) {
        WeddingCompany weddingCompany = new WeddingCompany(new You());
        //WeddingCompany传入了一个目标对象You,没有通过You来直接调用方法
        //而是通过weddingcompany对象来调用的
        weddingCompany.marry();
        System.out.println("----------------------");
       /* new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("111");
            }
        }).start();*/
        new Thread(()-> System.out.println("我爱你")).start();//Thread类实现了Runnable接口,它代理了实现了Runnable接口的类,然后调用代理方法
        new WeddingCompany(new You()).marry();
    }
}
//真实对象You和代理对象WeddingCompany都要实现同一个接口(Marry)
//代理对象要代理真实角色,
//一个实现类调用同接口下另一个实现类的方法,目的是在不改变原来代码的基础上增强代码,即通过婚庆公司调用marry可以在本来You的重写的marry方法之前之后做一些其他事情
//代理对象可以代理很多真实对象做不了的事情,真实对象专注于自己的事情

interface Marry{
    void marry();
}
//真实角色
class You implements Marry{
    @Override
    public void marry() {
        System.out.println("我结婚了");
    }
}
//代理角色
class WeddingCompany implements Marry{
    private Marry target;

    public WeddingCompany(Marry target) {
        this.target = target;
    }

    @Override
    public void marry() {
        before();
        this.target.marry();  //传入的真实对象调用了结婚
        after();
    }

    private void after() {
        System.out.println("生孩子");
    }

    private void before() {
        System.out.println("谈恋爱");
    }

}

Java中的静态代理要求 代理类 委托类 都实现同一个接口

委托类作为一个参数传入代理类中,在代理类中重写的函数中就可以在 调用委托类的重写的函数 的前后做一些操作,丰富了操作

包括实现Runnable接口也是一样的道理,Thread是代理类,实现Runnable接口的类是委托类,将实现Runnable接口的类传入到Thread类中,实现了静态代理

/* new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("111");
            }
        }).start();*/
//Lambda表达式简化后如下
new Thread(()-> System.out.println("我爱你")).start();//Thread类实现了Runnable接口,它代理了实现了Runnable接口的类,然后调用代理方法

new WeddingCompany(new You()).marry();

线程体(也就是我们要执行的具体任务)实现了Runnable接口和run方法。同时Thread类也实现了Runnable接口。此时,线程体就相当于目标角色,Thread就相当于代理角色。当程序调用了Thread的start()方法后,Thread的run()方法会在某个特定的时候被调用。thread.run()方法:

public void run() {
	if (target != null) {
  	  target.run();
	}
}

实际上是执行了线程体的代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值