Java学习——多线程之静态代理模式

Java学习——多线程之静态代理模式

我们在学习Java时知道23种设计模式是前人总结出来的比较好的模式,以供后人使用,那么23种设计模式到底是哪23种呢?主要分为3大类,如下:

1.创建型模式(共五种):工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。
2.结构型模式(共七种):适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。
3.行为型模式(共十一种):策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

那么今天我们就来学习代理模式里面的一种静态代理模式,有静态代理当然就有动态代理,今天我们就先来看静态代理,因为在多线程种我们需要了解到静态代理模式。

我们设想一个场景:比如说你要结婚了,那是不是要请一个婚庆公司。因为结婚这事你需要亲力亲为,但是像布置结婚现场、活跃结婚气氛、主持结婚流程、包括善后工作,作为结婚的你当然是忙的不可开交,自然不能去做这些事情了,那么你是不是就请了一个婚庆公司,让婚庆公司帮你去做这些事,代替你去做结婚的这些事情,虽然你和婚庆公司都要去做结婚这件事情,但是其实本质上来说结婚的还是你自己。下面我们来看下用代码怎么去实现:

/**
 * 静态代理模式:
 *              1.真实角色
 *              2.代理角色
 *              3.共同要实现的接口
 *     注意:
 *          代理对象代理真实角色去结婚,真实结婚的还是真实对象。
 *     优点:
 *          代理对象可以做很多真实对象做不了的事情,真实对象专心的去做自己的事情
 */
public class StaticProxy {
    public static void main(String[] args) {
        //结婚,让代理帮你,至于要将你作为对象交给代理对象,它就可以帮你完成结婚

        //获取真实角色
        You you = new You();
        //获取代理角色,并将真实角色传给代理角色
        WeddingCompany weddingCompany = new WeddingCompany(you);

        //代理觉得帮你去结婚,实际上还是你自己去结婚的,不过结婚所附带的是就不用你去做了,你只需要专注结婚,其他的事情代理帮你做好
        weddingCompany.happyMarry();
    }
}

//你
class You implements Marry{

    @Override
    public void happyMarry() {
        System.out.println("你要结婚了");
    }
}
//你的代理对象:婚庆公司
class WeddingCompany implements Marry{
    private You you;

    public WeddingCompany(You you) {
        this.you = you;
    }

    @Override
    public void happyMarry() {
        //结婚之前代理帮真实角色做的事
        System.out.println("结婚之前,布置现场");
        //真实角色只用专注于结婚就行了
        you.happyMarry();
        //结婚之后代理帮真实角色做的事
        System.out.println("结婚之后,惨不忍睹");
    }
}

//你们都要做的事(接口):结婚
interface Marry{
    void happyMarry();
}

我们看见这个代码是不是与我们多线程种实现Runnable接口,重写run方法非常的相似呢,我们再来回顾一下第二种线程的实现方式:

/**
 * 创建线程方式二:
 *          1.实现Runnable接口
 *          2.重写run方法
 *          3.借助静态代理模式开启线程
 */

//1.实现Runnable接口
public class TestNewThread02 implements Runnable{
    //2.重写run方法
    @Override
    public void run() {
        //这里是线程体
        for (int i = 0; i < 10; i++) {
            System.out.println("一个新的线程");
        }
    }

    //主线程
    public static void main(String[] args) {
        //3.使用静态代理模式开启线程
        TestNewThread02 thread02 = new TestNewThread02();
        Thread t = new Thread(thread02);
        t.start();

        System.out.println("main线程");

    }
}

在多线程的这种实现方法中就用到了静态代理模式,其实Thread类就相当于是代理(例子里里面的婚庆公司),它代理TestNewThread02类去实现start()方法。其实Thread类也实现了Runnable,TestNewThread02类也实现了Runnnable,只是我们平时没有注意到而已,点开Thread的源码:
在这里插入图片描述
我们发现Thread也实现了Runnable,所以线程的这种实现方法就是一个标准的静态代理模式。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值